<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.athico.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-5869426</atom:id><lastBuildDate>Wed, 17 Mar 2010 23:23:18 +0000</lastBuildDate><title>Drools - Business Logic integration Platform</title><description>This blog is for all things AI related, with a special focus on Expert Systems, particularly Drools.</description><link>http://blog.athico.com/</link><managingEditor>noreply@blogger.com (Mark Proctor)</managingEditor><generator>Blogger</generator><openSearch:totalResults>426</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.athico.com/DroolsRSS" /><feedburner:info uri="droolsrss" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5869426.post-4067578585193299289</guid><pubDate>Wed, 17 Mar 2010 22:26:00 +0000</pubDate><atom:updated>2010-03-17T23:23:18.745Z</atom:updated><category domain="http://www.blogger.com/atom/ns#">Presentation</category><category domain="http://www.blogger.com/atom/ns#">Drools</category><title>James Taylor to Keynote for Drools Meeting in San Diego on April 19th</title><description>James Taylor,&lt;a href="http://www.smartenoughsystems.com/"&gt; Smart Enough Systems&lt;/a&gt;, is going to keynote for us on Wednesday at our Drools meeting starting April 19th, as &lt;a href="http://blog.athico.com/2010/03/april-19th-boot-camp-to-be-open-to-all.html"&gt;blogged&lt;/a&gt; here. The talk will be titled "Smarter systems for uncertain times". I'll blog more details in a few hours.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Jrhwx8X9P7g/S6FZGCY_2TI/AAAAAAAAAZk/ldnKm9jRrZw/s1600-h/smart_enough_systems.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 301px; height: 400px;" src="http://3.bp.blogspot.com/_Jrhwx8X9P7g/S6FZGCY_2TI/AAAAAAAAAZk/ldnKm9jRrZw/s400/smart_enough_systems.jpg" alt="" id="BLOGGER_PHOTO_ID_5449734984350816562" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5869426-4067578585193299289?l=blog.athico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=BVvvi0VpNhU:dhsz4CLrjoU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=BVvvi0VpNhU:dhsz4CLrjoU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=BVvvi0VpNhU:dhsz4CLrjoU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=BVvvi0VpNhU:dhsz4CLrjoU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=BVvvi0VpNhU:dhsz4CLrjoU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=BVvvi0VpNhU:dhsz4CLrjoU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=BVvvi0VpNhU:dhsz4CLrjoU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=BVvvi0VpNhU:dhsz4CLrjoU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=BVvvi0VpNhU:dhsz4CLrjoU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=BVvvi0VpNhU:dhsz4CLrjoU:jWeZv7XsJd0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=jWeZv7XsJd0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DroolsRSS/~4/BVvvi0VpNhU" height="1" width="1"/&gt;</description><link>http://feeds.athico.com/~r/DroolsRSS/~3/BVvvi0VpNhU/james-taylor-to-key-note-for-drools.html</link><author>noreply@blogger.com (Mark Proctor)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_Jrhwx8X9P7g/S6FZGCY_2TI/AAAAAAAAAZk/ldnKm9jRrZw/s72-c/smart_enough_systems.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.athico.com/2010/03/james-taylor-to-key-note-for-drools.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5869426.post-2829388987070525507</guid><pubDate>Mon, 15 Mar 2010 16:28:00 +0000</pubDate><atom:updated>2010-03-15T16:39:43.499Z</atom:updated><category domain="http://www.blogger.com/atom/ns#">Drools Boot Camp</category><category domain="http://www.blogger.com/atom/ns#">Drools</category><title>April 19th Boot Camp to be open to all</title><description>We will now be opening the boot camp up to all, for the last 3 days. The boot camp was previously announced &lt;a href="http://blog.athico.com/2010/03/drools-open-source-healthcare.html"&gt;here&lt;/a&gt;. The over all schedule is below. I'll be putting up a registration wiki page up on line in the next day or two, like last years which you can fine &lt;a href="http://community.jboss.org/wiki/DroolsBootCampSanFranciscoJune2009"&gt;here&lt;/a&gt;. Keep an eye on the blog for more info soon.&lt;br /&gt;&lt;br /&gt;We are looking for people that would like to present, take a focus group or workshop. The topics can be on drools, or how drools is applied, or on projects that use drools, or just general interesting topics for rules, workflow, event processing and ontologies - anything you think the people there would be interested in. Email me if you would like to present&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Where &lt;/strong&gt;- San Diego, CA (meeting place tbc)&lt;strong&gt;&lt;br /&gt;Date  &lt;/strong&gt;- Monday the 19th of April to Friday the 23rd of April&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight: bold;"&gt;Schedule&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Mon-Tue&lt;/strong&gt; (medical only) The the first two days  are exclusive to the medical community and only people from medical  organisations or with a medical background will be allowed to attend.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;Wed&lt;/strong&gt;  (medical focus - open to all) The third day will still maintain a  medical theme, wrapping up the last two days, but we will open it up  for those that want to observe or participate. We will try and cover topics that will be interesting to all there, even if not from medical background, just be aware that medical discussions take priority.&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;strong&gt;Thu-Fri&lt;/strong&gt;  (general topics - open to all) The last two days is open to all  and will have no specific topic&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5869426-2829388987070525507?l=blog.athico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=y4kIv0h7FKs:Rze1ubseZdA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=y4kIv0h7FKs:Rze1ubseZdA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=y4kIv0h7FKs:Rze1ubseZdA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=y4kIv0h7FKs:Rze1ubseZdA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=y4kIv0h7FKs:Rze1ubseZdA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=y4kIv0h7FKs:Rze1ubseZdA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=y4kIv0h7FKs:Rze1ubseZdA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=y4kIv0h7FKs:Rze1ubseZdA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=y4kIv0h7FKs:Rze1ubseZdA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=y4kIv0h7FKs:Rze1ubseZdA:jWeZv7XsJd0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=jWeZv7XsJd0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DroolsRSS/~4/y4kIv0h7FKs" height="1" width="1"/&gt;</description><link>http://feeds.athico.com/~r/DroolsRSS/~3/y4kIv0h7FKs/april-19th-boot-camp-to-be-open-to-all.html</link><author>noreply@blogger.com (Mark Proctor)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.athico.com/2010/03/april-19th-boot-camp-to-be-open-to-all.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5869426.post-4824928344678591333</guid><pubDate>Fri, 12 Mar 2010 13:43:00 +0000</pubDate><atom:updated>2010-03-12T13:47:56.831Z</atom:updated><category domain="http://www.blogger.com/atom/ns#">constraint programming</category><category domain="http://www.blogger.com/atom/ns#">solver</category><category domain="http://www.blogger.com/atom/ns#">planner</category><category domain="http://www.blogger.com/atom/ns#">Drools</category><title>CHR 2010 (Constraint Handling Rules)</title><description>I'll be a guest speaker at this years CHR 2010.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.cs.kuleuven.be/%7Edtai/CHR/CHR2010/"&gt;&lt;span style="font-weight: bold;"&gt;CHR 2010  - The Seventh International Workshop on Constraint Handling Rules.&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"The &lt;/span&gt;&lt;em style="font-style: italic;"&gt;CHR 2010 Workshop&lt;/em&gt;&lt;span style="font-style: italic;"&gt; will be held July 20, 2010  in Edinburgh (Scotland) at the occasion of  &lt;/span&gt;&lt;a style="font-style: italic;" href="http://www.floc-conference.org/ICLP.html"&gt;&lt;acronym title="International Conference on Logic Programming"&gt;ICLP&lt;/acronym&gt;  2010&lt;/a&gt;&lt;span style="font-style: italic;"&gt; (part of &lt;/span&gt;&lt;a style="font-style: italic;" href="http://www.floc-conference.org/"&gt;&lt;acronym title="Federated Logic Conference"&gt;FLoC&lt;/acronym&gt; 2010&lt;/a&gt;&lt;span style="font-style: italic;"&gt;), the premier international venue for presenting research in logic  programming. &lt;/span&gt; &lt;p style="font-style: italic;"&gt; The Constraint Handling Rules (CHR) language has become a major  declarative specification formalism and implementation language for constraint  reasoning algorithms and applications. Algorithms are often specified using inference rules, rewrite rules,  sequents, proof rules, or logical axioms that can be directly written in CHR. Its clean semantics facilitates program design, analysis, and  transformation. See the &lt;a href="http://www.cs.kuleuven.be/%7Edtai/projects/CHR/"&gt;CHR  website&lt;/a&gt; for more information.&lt;/p&gt;&lt;p style="font-style: italic;"&gt;...&lt;/p&gt;&lt;h3&gt;Invited Speaker&lt;/h3&gt;    &lt;p&gt;     &lt;img src="http://www.cs.kuleuven.be/%7Edtai/CHR/CHR2010/icons/new.png" alt="new!" style="float: left; margin: 0pt 10px 10px 0pt;" /&gt;     We are privileged to announce a distinguished invited speaker this  year: Mark Proctor,     lead of the thriving, innovating &lt;a href="http://www.jboss.org/drools/"&gt;JBoss Drools&lt;/a&gt; project.     He will be introducing the &lt;em&gt;Drools Business Logic integration  Platform&lt;/em&gt;,     a fully featured business rule engine and management system that      seamlessly integrates powerful Complex Event Processing and workflow  capabilities."&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5869426-4824928344678591333?l=blog.athico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=-Ri8mTI-ooA:megpRiuB0OY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=-Ri8mTI-ooA:megpRiuB0OY:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=-Ri8mTI-ooA:megpRiuB0OY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=-Ri8mTI-ooA:megpRiuB0OY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=-Ri8mTI-ooA:megpRiuB0OY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=-Ri8mTI-ooA:megpRiuB0OY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=-Ri8mTI-ooA:megpRiuB0OY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=-Ri8mTI-ooA:megpRiuB0OY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=-Ri8mTI-ooA:megpRiuB0OY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=-Ri8mTI-ooA:megpRiuB0OY:jWeZv7XsJd0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=jWeZv7XsJd0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DroolsRSS/~4/-Ri8mTI-ooA" height="1" width="1"/&gt;</description><link>http://feeds.athico.com/~r/DroolsRSS/~3/-Ri8mTI-ooA/chr-2010-constraint-handling-rules.html</link><author>noreply@blogger.com (Mark Proctor)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.athico.com/2010/03/chr-2010-constraint-handling-rules.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5869426.post-7045583020228288831</guid><pubDate>Tue, 09 Mar 2010 23:28:00 +0000</pubDate><atom:updated>2010-03-09T23:35:17.511Z</atom:updated><category domain="http://www.blogger.com/atom/ns#">Healthcare</category><category domain="http://www.blogger.com/atom/ns#">medical</category><category domain="http://www.blogger.com/atom/ns#">Drools</category><title>Drools Open Source Healthcare  Conference, 19th of April, San Diego</title><description>The Drools Open Source Healthcare conference, mentioned previous &lt;a href="http://blog.athico.com/2010/02/open-source-healthcare-event-last-week.html"&gt;here&lt;/a&gt;, has the go ahead. 19th of April, San Diego. Will blog more details soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5869426-7045583020228288831?l=blog.athico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=epElJsJ-5Fg:ie75mxUcY7U:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=epElJsJ-5Fg:ie75mxUcY7U:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=epElJsJ-5Fg:ie75mxUcY7U:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=epElJsJ-5Fg:ie75mxUcY7U:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=epElJsJ-5Fg:ie75mxUcY7U:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=epElJsJ-5Fg:ie75mxUcY7U:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=epElJsJ-5Fg:ie75mxUcY7U:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=epElJsJ-5Fg:ie75mxUcY7U:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=epElJsJ-5Fg:ie75mxUcY7U:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=epElJsJ-5Fg:ie75mxUcY7U:jWeZv7XsJd0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=jWeZv7XsJd0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DroolsRSS/~4/epElJsJ-5Fg" height="1" width="1"/&gt;</description><link>http://feeds.athico.com/~r/DroolsRSS/~3/epElJsJ-5Fg/drools-open-source-healthcare.html</link><author>noreply@blogger.com (Mark Proctor)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.athico.com/2010/03/drools-open-source-healthcare.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5869426.post-5256924699417541549</guid><pubDate>Wed, 03 Mar 2010 18:09:00 +0000</pubDate><atom:updated>2010-03-03T18:31:53.008Z</atom:updated><category domain="http://www.blogger.com/atom/ns#">competition</category><category domain="http://www.blogger.com/atom/ns#">solver</category><category domain="http://www.blogger.com/atom/ns#">planner</category><title>Nurse Rostering Competition 2010</title><description>The International Timetabling Competition 2007 has a follow up: the &lt;a href="http://www.kuleuven-kortrijk.be/nrpcompetition"&gt;Nurse Rostering Competition 2010&lt;/a&gt;.&lt;br /&gt;So expect a &lt;a href="http://www.jboss.org/drools/drools-planner.html"&gt;Drools Planner&lt;/a&gt; nurse rostering example soon :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Building on the success of the two timetabling competitions, this competition on the nurse rostering problem aims to further develop interest in the general area of rostering and timetabling while providing researchers with models of the problems faced which incorporate an increased number of real world constraints.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;The competition is composed of three tracks, called after the Olympic disciplines sprint, middle distance running and long distance running. These tracks represent distinct problem settings in practice and algorithm performance is often tuned to the available running time. The organisers do welcome researchers to trial their techniques on more than one track. The winner of each track receives a prize of €535 and free registration to &lt;a href="http://www.cs.qub.ac.uk/~B.McCollum/patat10/"&gt;PATAT&lt;/a&gt; in Belfast 2010.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Who's up for some competition? Bring it on!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5869426-5256924699417541549?l=blog.athico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=BDIabe_8TnQ:teJ1jmr3xk4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=BDIabe_8TnQ:teJ1jmr3xk4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=BDIabe_8TnQ:teJ1jmr3xk4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=BDIabe_8TnQ:teJ1jmr3xk4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=BDIabe_8TnQ:teJ1jmr3xk4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=BDIabe_8TnQ:teJ1jmr3xk4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=BDIabe_8TnQ:teJ1jmr3xk4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=BDIabe_8TnQ:teJ1jmr3xk4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=BDIabe_8TnQ:teJ1jmr3xk4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=BDIabe_8TnQ:teJ1jmr3xk4:jWeZv7XsJd0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=jWeZv7XsJd0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DroolsRSS/~4/BDIabe_8TnQ" height="1" width="1"/&gt;</description><link>http://feeds.athico.com/~r/DroolsRSS/~3/BDIabe_8TnQ/nurse-rostering-competition-2010.html</link><author>noreply@blogger.com (Geoffrey De Smet)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.athico.com/2010/03/nurse-rostering-competition-2010.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5869426.post-5253154710849208039</guid><pubDate>Sat, 27 Feb 2010 17:38:00 +0000</pubDate><atom:updated>2010-02-28T09:12:11.311Z</atom:updated><category domain="http://www.blogger.com/atom/ns#">solver</category><category domain="http://www.blogger.com/atom/ns#">planner</category><title>Best score over time graphs</title><description>It's easy to create different &lt;a href="http://www.jboss.org/drools/drools-planner.html"&gt;Drools Planner&lt;/a&gt; configurations, but it's sometimes hard to determine which configuration is the best for your automated planning problem.&lt;br /&gt;&lt;br /&gt;The benchmarker allows you to play out different configurations against each other and it ranks the configurations, but you can easily make a scalability misjudgment: just because config A is better than config B when given 5 minutes, doesn't mean that A will be better then B when given 60 minutes. Sometimes the opposite is true.&lt;br /&gt;&lt;br /&gt;It's not only interesting to see what best score a configuration has after the given time, but also &lt;span style="font-style:italic;"&gt;how it got there&lt;/span&gt;. And that's why the benchmarker now supports outputting a graph with the best score over time.&lt;br /&gt;&lt;h2&gt;Graph examples&lt;/h2&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_DkCPgdrtcek/S4lj4X6BS5I/AAAAAAAAAGI/VvrkRnwQ2gI/s1600-h/exam_comp_set5Statistic.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_DkCPgdrtcek/S4lj4X6BS5I/AAAAAAAAAGI/VvrkRnwQ2gI/s400/exam_comp_set5Statistic.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5442991444795149202" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Above we see that the green configuration wins. But less then 50 seconds (= 50&amp;nbsp;000 milliseconds) earlier, the red configuration would have won.&lt;br /&gt;&lt;br /&gt;Not all datasets have the same curve. Some datasets are harder because they are more compact (not necessarily bigger), making it harder to move resources around. Harder dataset can separate the weak from the strong configurations more clearly.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_DkCPgdrtcek/S4llc3JLzXI/AAAAAAAAAGQ/EClkSS4t80I/s1600-h/exam_comp_set7Statistic.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_DkCPgdrtcek/S4llc3JLzXI/AAAAAAAAAGQ/EClkSS4t80I/s400/exam_comp_set7Statistic.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5442993171167169906" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Above we can see that the green and yellow configurations take less than half the time of the other configurations to achieve the same score.&lt;br /&gt;&lt;h2&gt;Lies, damned lies and statistics&lt;/h2&gt;&lt;br /&gt;Now, before you start drawing conclusions from the above diagrams, take these things into consideration:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The 4 configurations shown are almost identical and differ only in tabu type. They don't differ in the important things, such as the move factory implementations or absolutionSelection/relativeSelection size. They are already the best out of many inferior configurations.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;400 000 milliseconds is only 7,5 minutes. Many of the algorithms don't "flatline" yet in that time. Their ROI time (return on invested time) is still high.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;In an upcoming blog/article I 'll demonstrate the effect of giving Drools Planner more time and the importance of using a real-world time limitation.&lt;br /&gt;&lt;br /&gt;Thanks to the excellent &lt;a href="http://www.jfree.org/jfreechart/"&gt;JFreeChart&lt;/a&gt; library for making it so easy to turn data into a graph. It's a pity though that out-of-the-box it uses yellow as the 4th line's color, making it hard to see on the default white background.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5869426-5253154710849208039?l=blog.athico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=Omly0FtdUtc:fk4aSgsvMkc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=Omly0FtdUtc:fk4aSgsvMkc:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=Omly0FtdUtc:fk4aSgsvMkc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=Omly0FtdUtc:fk4aSgsvMkc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=Omly0FtdUtc:fk4aSgsvMkc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=Omly0FtdUtc:fk4aSgsvMkc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=Omly0FtdUtc:fk4aSgsvMkc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=Omly0FtdUtc:fk4aSgsvMkc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=Omly0FtdUtc:fk4aSgsvMkc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=Omly0FtdUtc:fk4aSgsvMkc:jWeZv7XsJd0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=jWeZv7XsJd0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DroolsRSS/~4/Omly0FtdUtc" height="1" width="1"/&gt;</description><link>http://feeds.athico.com/~r/DroolsRSS/~3/Omly0FtdUtc/best-score-over-time-graphs.html</link><author>noreply@blogger.com (Geoffrey De Smet)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_DkCPgdrtcek/S4lj4X6BS5I/AAAAAAAAAGI/VvrkRnwQ2gI/s72-c/exam_comp_set5Statistic.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.athico.com/2010/02/best-score-over-time-graphs.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5869426.post-428272355769224424</guid><pubDate>Mon, 22 Feb 2010 19:19:00 +0000</pubDate><atom:updated>2010-02-22T20:38:32.827Z</atom:updated><category domain="http://www.blogger.com/atom/ns#">Performance</category><category domain="http://www.blogger.com/atom/ns#">Drools</category><title>Collection-oriented Match for massively parallel Drools 6</title><description>With multi-cores becoming ever cheaper the desire to push Drools into parallel processing is increasing. We've already added rulebase partitioning, which helps throughput for CEP type problems, but that doesn't solve the parallel matching.&lt;br /&gt;&lt;br /&gt;I've followed &lt;a href="http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.53.612"&gt;ParaOPS5&lt;/a&gt;, but wasn't comfortable enough that the design would deliver universal speed improvements compared to the complexity it brings.  With ParaOPS5 each partial match  when propagated to a node for evaluation was submitted to a queue for evaluation as a "task". This produces something that is very fine grained, and as a node, or potentially the index in a node is a locking point, there is a lot of waiting around for very small units of work.&lt;br /&gt;&lt;br /&gt;A while back I stumbled across this paper &lt;a href="http://teamcore.usc.edu/papers/1993/cikm-final.pdf"&gt;"Collection-Oriented Match by Anurag Acharya and Milind Tambe"&lt;/a&gt;.  The paper is well written and relatively easy to understand. Here it proposes instead of propagating the partial match once it's created, it instead stays in the node and produce all partial matches which are stored in a collection, it's this collection we then propagate. This propagated collection is submitted as a "task" to the queue. This allows for larger units of work, as more is done in the node itself. The approach is not without it's problems, particularly around left indexing, as partial matches in the same propagated collection could be in different indexes for the node.&lt;br /&gt;&lt;br /&gt;However we feel that this shows a lot of promise and have decided to explore this as the underlying algorithm for Drools 6. We'll hopefully have a basic prototype working this summer, and then we'll have some ideas on advantages and disadvantages.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5869426-428272355769224424?l=blog.athico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=vrJppdj3HEE:iE7acpQ_Xw0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=vrJppdj3HEE:iE7acpQ_Xw0:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=vrJppdj3HEE:iE7acpQ_Xw0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=vrJppdj3HEE:iE7acpQ_Xw0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=vrJppdj3HEE:iE7acpQ_Xw0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=vrJppdj3HEE:iE7acpQ_Xw0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=vrJppdj3HEE:iE7acpQ_Xw0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=vrJppdj3HEE:iE7acpQ_Xw0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=vrJppdj3HEE:iE7acpQ_Xw0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=vrJppdj3HEE:iE7acpQ_Xw0:jWeZv7XsJd0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=jWeZv7XsJd0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DroolsRSS/~4/vrJppdj3HEE" height="1" width="1"/&gt;</description><link>http://feeds.athico.com/~r/DroolsRSS/~3/vrJppdj3HEE/collection-oriented-match-for-massively.html</link><author>noreply@blogger.com (Mark Proctor)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.athico.com/2010/02/collection-oriented-match-for-massively.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5869426.post-4887172785404264289</guid><pubDate>Sun, 21 Feb 2010 19:43:00 +0000</pubDate><atom:updated>2010-02-21T19:48:53.890Z</atom:updated><category domain="http://www.blogger.com/atom/ns#">Rete</category><category domain="http://www.blogger.com/atom/ns#">Rule Engines</category><title>Versatile Benchmarking for Concurrent Production System Architectures</title><description>Found this paper which I thought might interest people:&lt;br /&gt;&lt;a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.48.9392&amp;amp;rep=rep1&amp;amp;type=pdf"&gt;http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.48.9392&amp;amp;rep=rep1&amp;amp;type=pdf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;"The shortage of adequate benchmarking is a major problem in the evaluation of novel production system machine organisations. This paper presents a survey of benchmark programs used in published research for improvement of production systems. We offer a new benchmark problem that allows independent variation in the size of the database, the number of productions, the ratio between local and global data, and the variance in the size of the local data clusters."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5869426-4887172785404264289?l=blog.athico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=fy5jp7L1pTQ:ucLFaxzt9iU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=fy5jp7L1pTQ:ucLFaxzt9iU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=fy5jp7L1pTQ:ucLFaxzt9iU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=fy5jp7L1pTQ:ucLFaxzt9iU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=fy5jp7L1pTQ:ucLFaxzt9iU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=fy5jp7L1pTQ:ucLFaxzt9iU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=fy5jp7L1pTQ:ucLFaxzt9iU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=fy5jp7L1pTQ:ucLFaxzt9iU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=fy5jp7L1pTQ:ucLFaxzt9iU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=fy5jp7L1pTQ:ucLFaxzt9iU:jWeZv7XsJd0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=jWeZv7XsJd0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DroolsRSS/~4/fy5jp7L1pTQ" height="1" width="1"/&gt;</description><link>http://feeds.athico.com/~r/DroolsRSS/~3/fy5jp7L1pTQ/versatile-benchmarking-for-concurrent.html</link><author>noreply@blogger.com (Mark Proctor)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.athico.com/2010/02/versatile-benchmarking-for-concurrent.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5869426.post-8340600999142481392</guid><pubDate>Fri, 19 Feb 2010 12:11:00 +0000</pubDate><atom:updated>2010-02-19T14:05:58.913Z</atom:updated><category domain="http://www.blogger.com/atom/ns#">use case</category><category domain="http://www.blogger.com/atom/ns#">solver</category><category domain="http://www.blogger.com/atom/ns#">planner</category><title>Automated planning problems are cursed with NP completeness</title><description>Drools Planner (formerly known as Drools Solver) optimizes automated planning. Real world planning problems are almost always NP complete. But what does NP complete mean? And why is it so annoying? And how does Drools Planner deal with it?&lt;br /&gt;&lt;br /&gt;Let's take a look at the bin packaging use case. In this simple 2D bin packaging example we have to put 5 items of different sizes into a 4 by 8 container:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_DkCPgdrtcek/S36Ayiw4HdI/AAAAAAAAAFs/yVQYkVm7rHc/s1600-h/binPackagingUseCase.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_DkCPgdrtcek/S36Ayiw4HdI/AAAAAAAAAFs/yVQYkVm7rHc/s400/binPackagingUseCase.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5439927005723762130" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There are 3 solutions presented, but only the last solution is feasible:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The first algorithm puts in the items with the largest size first. It starts with the purple item of size 9. In the end, the blue item doesn't fit.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The second algorithm puts in the items with the largest side first. It starts with the blue item which has a side of 5. In the end, the green item doesn't fit.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The last algorithm, one of Drools Planner's algorithms, manages to fit in all the items and generate a feasible solution.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Why does the yellow item has to be at the bottom (or the top) in a feasible solution for this problem instance? Let's take a look at 3 more problem instances and a feasible solution for each of them:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_DkCPgdrtcek/S36A6eiux8I/AAAAAAAAAF0/bYVRZLIrGLQ/s1600-h/binPackagingIsNpComplete1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_DkCPgdrtcek/S36A6eiux8I/AAAAAAAAAF0/bYVRZLIrGLQ/s400/binPackagingIsNpComplete1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5439927142029641666" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The yellow item is in a different location in each of those problem instances. It's location depends upon the size of the container, all of the items involved and the constraints. They call this phenomenon &lt;a href="http://en.wikipedia.org/wiki/NP-complete"&gt;NP complete&lt;/a&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It is easy to verify a feasible solution,&lt;/li&gt;&lt;br /&gt;&lt;li&gt;But it is hard to find a feasible solution.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Only by trying many (or all) of the solutions, we find a feasible solution. Actually, we can't even easily prove if there even is a feasible solution:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_DkCPgdrtcek/S36BAZQMXoI/AAAAAAAAAF8/l9GuvFbxfoQ/s1600-h/binPackagingIsNpComplete2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_DkCPgdrtcek/S36BAZQMXoI/AAAAAAAAAF8/l9GuvFbxfoQ/s400/binPackagingIsNpComplete2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5439927243688926850" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Even though the total size of the items is 14 and the container is size 18, we &lt;br /&gt;humans can easily see that there's no feasible solution for this tiny planning problem.&lt;br /&gt;But what if the planning problem is bigger?&lt;br /&gt;&lt;br /&gt;Real world bin packaging has thousands of items, multiple containers, different container sizes and many more other constraints. &lt;br /&gt;&lt;br /&gt;So, how do we make the computer automate it? Brute force?&lt;br /&gt;No, because brute force takes too long. Instead, &lt;a href="http://www.jboss.org/drools/drools-planner.html"&gt;Drools Planner&lt;/a&gt; optimizes it with metaheuristic algorithms, such as tabu search and simulated annealing.&lt;br /&gt;&lt;br /&gt;In a upcoming blog, I 'll prove that brute force takes billions of years even for small planning problems.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5869426-8340600999142481392?l=blog.athico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=6A-L9q1xCl8:Cg5S56DclKE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=6A-L9q1xCl8:Cg5S56DclKE:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=6A-L9q1xCl8:Cg5S56DclKE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=6A-L9q1xCl8:Cg5S56DclKE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=6A-L9q1xCl8:Cg5S56DclKE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=6A-L9q1xCl8:Cg5S56DclKE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=6A-L9q1xCl8:Cg5S56DclKE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=6A-L9q1xCl8:Cg5S56DclKE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=6A-L9q1xCl8:Cg5S56DclKE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=6A-L9q1xCl8:Cg5S56DclKE:jWeZv7XsJd0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=jWeZv7XsJd0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DroolsRSS/~4/6A-L9q1xCl8" height="1" width="1"/&gt;</description><link>http://feeds.athico.com/~r/DroolsRSS/~3/6A-L9q1xCl8/automated-planning-problems-are-cursed.html</link><author>noreply@blogger.com (Geoffrey De Smet)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_DkCPgdrtcek/S36Ayiw4HdI/AAAAAAAAAFs/yVQYkVm7rHc/s72-c/binPackagingUseCase.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.athico.com/2010/02/automated-planning-problems-are-cursed.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5869426.post-330222616040049646</guid><pubDate>Tue, 16 Feb 2010 21:43:00 +0000</pubDate><atom:updated>2010-02-16T21:49:57.841Z</atom:updated><title>Enterprise Space Invaders !</title><description>Here is a a &lt;a href="http://eis-blog.ucsc.edu/2010/02/space-invaders-enterprise-edition/"&gt;great article on using declarative rules&lt;/a&gt; (drools in this case) in game programming (versus loops within loops).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5869426-330222616040049646?l=blog.athico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=Jy3pYZ8EXrc:pwvUEijBqCg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=Jy3pYZ8EXrc:pwvUEijBqCg:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=Jy3pYZ8EXrc:pwvUEijBqCg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=Jy3pYZ8EXrc:pwvUEijBqCg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=Jy3pYZ8EXrc:pwvUEijBqCg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=Jy3pYZ8EXrc:pwvUEijBqCg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=Jy3pYZ8EXrc:pwvUEijBqCg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=Jy3pYZ8EXrc:pwvUEijBqCg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=Jy3pYZ8EXrc:pwvUEijBqCg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=Jy3pYZ8EXrc:pwvUEijBqCg:jWeZv7XsJd0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=jWeZv7XsJd0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DroolsRSS/~4/Jy3pYZ8EXrc" height="1" width="1"/&gt;</description><link>http://feeds.athico.com/~r/DroolsRSS/~3/Jy3pYZ8EXrc/enterprise-space-invaders.html</link><author>noreply@blogger.com (Michael Neale)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.athico.com/2010/02/enterprise-space-invaders.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5869426.post-7227238666901445799</guid><pubDate>Tue, 09 Feb 2010 05:03:00 +0000</pubDate><atom:updated>2010-02-09T05:12:35.044Z</atom:updated><category domain="http://www.blogger.com/atom/ns#">Drools</category><title>CHEF: A Model of Case-based Planning</title><description>The original CHEF application for Case Based Reasoning (CBR) makes for an interesting read and is covered in the Expert Systems book (Peter Jackson) . I just found the original paper online, so I thought I'd share it. Maybe someone could start doing a CHEF implementation on top of Drools?&lt;br /&gt;&lt;a href="https://www.aaai.org/Papers/AAAI/1986/AAAI86-044.pdf"&gt;https://www.aaai.org/Papers/AAAI/1986/AAAI86-044.pdf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"CHEF is a case-based planner that builds new plans out of its&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;memory of old ones. CHEF’s domain is Szechwan cooking and its&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;task is to build new recipes on the basis of a user’s requests. CHEF’s&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;input is a set of goals for different tastes, textures, ingredients and&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;types of dishes and its output is a single recipe that satisfies all of its&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;goals. Its output is a single plan, in the form of a recipe, that satisfies&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;all of the users goals.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Before searching for a plan to modify, CHEF examines the goals in&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;its input and tries to anticipate any problems that might arise while&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;planning for them. If a failure is predicted, CHEF adds a goal to avoid&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;the failure to its list of goals to satisfy and this new goal is also used&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;to search for a plan. Because plans are indexed in memory by the&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;problems they avoid, this prediction can be used to find a plan that&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;solves the predicted problem. Much of CHEF’s planning power lies&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;in this ability to predict and thus avoid failures it has encountered&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;before."&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5869426-7227238666901445799?l=blog.athico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=-Ladgwymy3I:z28Jt25U4_Q:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=-Ladgwymy3I:z28Jt25U4_Q:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=-Ladgwymy3I:z28Jt25U4_Q:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=-Ladgwymy3I:z28Jt25U4_Q:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=-Ladgwymy3I:z28Jt25U4_Q:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=-Ladgwymy3I:z28Jt25U4_Q:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=-Ladgwymy3I:z28Jt25U4_Q:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=-Ladgwymy3I:z28Jt25U4_Q:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=-Ladgwymy3I:z28Jt25U4_Q:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=-Ladgwymy3I:z28Jt25U4_Q:jWeZv7XsJd0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=jWeZv7XsJd0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DroolsRSS/~4/-Ladgwymy3I" height="1" width="1"/&gt;</description><link>http://feeds.athico.com/~r/DroolsRSS/~3/-Ladgwymy3I/chef-model-of-case-based-planning.html</link><author>noreply@blogger.com (Mark Proctor)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.athico.com/2010/02/chef-model-of-case-based-planning.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5869426.post-533602436228392580</guid><pubDate>Thu, 04 Feb 2010 18:44:00 +0000</pubDate><atom:updated>2010-02-07T01:25:03.020Z</atom:updated><category domain="http://www.blogger.com/atom/ns#">video</category><category domain="http://www.blogger.com/atom/ns#">Presentation</category><category domain="http://www.blogger.com/atom/ns#">solver</category><category domain="http://www.blogger.com/atom/ns#">planner</category><title>JUG Lille video's: Drools and Drools Planner plus other Presentations</title><description>Last month Mark and I gave &lt;a href="http://blog.athico.com/2010/01/drools-jug-lille-21st-of-jan.html"&gt;a presentation in Lille&lt;/a&gt;  for &lt;a href="http://chtijug.org/"&gt;Ch'ti JUG&lt;/a&gt;. The video's are now online:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/9191648"&gt;Drools video of Mark Proctor at Ch'ti JUG.&lt;/a&gt;&lt;br /&gt;Mark shows an overview of Drools and in-depth examples of the rule engine.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/9204264"&gt;Drools Planner video of Geoffrey De Smet at Ch'ti JUG.&lt;/a&gt;&lt;br /&gt;I show several planning problem use cases (n queens, bin packaging, shift rostering, examination scheduling) and explain the deterministic and meta-heuristic algorithms to tame them.&lt;br /&gt;&lt;br /&gt;Here are links to more presentations:&lt;br /&gt;&lt;a href="http://community.jboss.org/servlet/JiveServlet/download/10741-264-7609/ruleml09markp.odp"&gt;RuleML2009&lt;/a&gt;&lt;br /&gt;&lt;a href="http://community.jboss.org/servlet/JiveServlet/download/10741-264-7608/lille2010markp.odp"&gt;Lille2010&lt;/a&gt;&lt;br /&gt;&lt;a href="http://community.jboss.org/servlet/JiveServlet/download/10741-264-7610/fosdem2010markp.odp"&gt;Fosdem2010&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5869426-533602436228392580?l=blog.athico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=L6WRwkrhLoI:Iu9d3d1FFhc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=L6WRwkrhLoI:Iu9d3d1FFhc:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=L6WRwkrhLoI:Iu9d3d1FFhc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=L6WRwkrhLoI:Iu9d3d1FFhc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=L6WRwkrhLoI:Iu9d3d1FFhc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=L6WRwkrhLoI:Iu9d3d1FFhc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=L6WRwkrhLoI:Iu9d3d1FFhc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=L6WRwkrhLoI:Iu9d3d1FFhc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=L6WRwkrhLoI:Iu9d3d1FFhc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=L6WRwkrhLoI:Iu9d3d1FFhc:jWeZv7XsJd0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=jWeZv7XsJd0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DroolsRSS/~4/L6WRwkrhLoI" height="1" width="1"/&gt;</description><link>http://feeds.athico.com/~r/DroolsRSS/~3/L6WRwkrhLoI/jug-lille-videos-drools-expert-and.html</link><author>noreply@blogger.com (Geoffrey De Smet)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.athico.com/2010/02/jug-lille-videos-drools-expert-and.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5869426.post-2471198971051435674</guid><pubDate>Mon, 01 Feb 2010 20:36:00 +0000</pubDate><atom:updated>2010-02-02T03:32:53.768Z</atom:updated><category domain="http://www.blogger.com/atom/ns#">Healthcare</category><category domain="http://www.blogger.com/atom/ns#">Drools</category><title>Open Source Healthcare Event (last week of March)</title><description>Last November I bloggged about the great news for collaboration on Drools between the US Navy and OSDE (Argentinian health care). This is with a focus of potentially enabling Drools as an important component for the Open Source Healthcare &lt;a href="http://www.connectopensource.org/display/Gateway/CONNECT+Community+Portal"&gt;Connect &lt;/a&gt;project, which provides a gateway into &lt;a href="http://healthit.hhs.gov/portal/server.pt?open=512&amp;amp;mode=2&amp;amp;cached=true&amp;amp;objID=1142"&gt;NHIN.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Since then we've had other heath care organisations show an interest in getting involved at some level. So it made sense that we should potentially organise another event, similar to last years boot camp, but specifically for the healthcare community.&lt;br /&gt;&lt;br /&gt;The event will cover the usual intro into Drools, along with additional talks on the recent developments of Drools; such as our simulation/testing frameworks and service frameworks. We would ideally like to keep this industry and academic research focused. That means we will need as many third party industry and academic research talks as possible and break out sessions to discuss requirements and potential collaborations.&lt;br /&gt;&lt;br /&gt;So whether you want to come along and tell the world about your research projects, requirements and ideas or just see what others are up to, or just find out what Drools is about, this should be a useful event for anyone in the healthcare industry.&lt;br /&gt;&lt;br /&gt;If this interests you, either as an attendee or a presenter, then please let me know. The date is quite soon, tentatively last week of March and at the Duke University in North Carolina for 3 days.&lt;br /&gt;&lt;br /&gt;Mark&lt;br /&gt;mproctor at codehaus d0t org&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5869426-2471198971051435674?l=blog.athico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=ZPvdl4mwZhY:7paoyYBz3GQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=ZPvdl4mwZhY:7paoyYBz3GQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=ZPvdl4mwZhY:7paoyYBz3GQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=ZPvdl4mwZhY:7paoyYBz3GQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=ZPvdl4mwZhY:7paoyYBz3GQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=ZPvdl4mwZhY:7paoyYBz3GQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=ZPvdl4mwZhY:7paoyYBz3GQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=ZPvdl4mwZhY:7paoyYBz3GQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=ZPvdl4mwZhY:7paoyYBz3GQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=ZPvdl4mwZhY:7paoyYBz3GQ:jWeZv7XsJd0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=jWeZv7XsJd0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DroolsRSS/~4/ZPvdl4mwZhY" height="1" width="1"/&gt;</description><link>http://feeds.athico.com/~r/DroolsRSS/~3/ZPvdl4mwZhY/open-source-healthcare-event-last-week.html</link><author>noreply@blogger.com (Mark Proctor)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.athico.com/2010/02/open-source-healthcare-event-last-week.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5869426.post-2260473116306234689</guid><pubDate>Mon, 01 Feb 2010 17:21:00 +0000</pubDate><atom:updated>2010-02-01T17:48:10.938Z</atom:updated><category domain="http://www.blogger.com/atom/ns#">solver</category><category domain="http://www.blogger.com/atom/ns#">planner</category><title>New Drools Planner website</title><description>The new Drools Planner website is up:&lt;br /&gt;&lt;a href="http://www.jboss.org/drools/drools-planner.html"&gt;http://www.jboss.org/drools/drools-planner.html&lt;/a&gt;&lt;br /&gt;It features diagrams of some use cases, to explain them more clearly.&lt;br /&gt;&lt;br /&gt;With the upcoming release of 5.1 milestone 2,&lt;br /&gt;this will complete the rename from Drools Solver to Drools Planner.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5869426-2260473116306234689?l=blog.athico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=JhXimfXWXjk:wN2k2gDYF4A:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=JhXimfXWXjk:wN2k2gDYF4A:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=JhXimfXWXjk:wN2k2gDYF4A:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=JhXimfXWXjk:wN2k2gDYF4A:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=JhXimfXWXjk:wN2k2gDYF4A:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=JhXimfXWXjk:wN2k2gDYF4A:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=JhXimfXWXjk:wN2k2gDYF4A:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=JhXimfXWXjk:wN2k2gDYF4A:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=JhXimfXWXjk:wN2k2gDYF4A:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=JhXimfXWXjk:wN2k2gDYF4A:jWeZv7XsJd0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=jWeZv7XsJd0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DroolsRSS/~4/JhXimfXWXjk" height="1" width="1"/&gt;</description><link>http://feeds.athico.com/~r/DroolsRSS/~3/JhXimfXWXjk/new-drools-planner-website.html</link><author>noreply@blogger.com (Geoffrey De Smet)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.athico.com/2010/02/new-drools-planner-website.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5869426.post-7047181506928331806</guid><pubDate>Fri, 22 Jan 2010 21:19:00 +0000</pubDate><atom:updated>2010-01-23T00:07:31.051Z</atom:updated><category domain="http://www.blogger.com/atom/ns#">Drools</category><title>Drools Inference and Truth Maintenance for good rule design and maintenance</title><description>Back in November I did a blog on inference and how it can be useful for rule authoring.&lt;br /&gt;&lt;a href="http://blog.athico.com/2009/11/what-is-inference-and-how-does-it.html"&gt;What is inference and how does it facilitate good rule design and maintenance&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The summary of this was:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;De-couple knowledge responsibilities&lt;/li&gt;&lt;li&gt;Encapsulate knowledge&lt;/li&gt;&lt;li&gt;Provide semantic abstractions for those encapsulations&lt;/li&gt;&lt;/ul&gt;For my JUG in Lille I extended this example by including truth maintenance, to demonstrate self maintaining systems.&lt;br /&gt;&lt;br /&gt;The previous example was issuing ID cards to over 18s, in this example we now issue bus passes, either a child or adult pass.&lt;pre class="brush:drl"&gt;rule "Issue Child Bus Pass" when&lt;br /&gt;  $p : Person( age &lt; 16 )&lt;br /&gt;then&lt;br /&gt;  insert(new ChildBusPass( $p ) );&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;rule "Issue Adult Bus Pass" when&lt;br /&gt;  $p : Person( age &gt;= 16 )&lt;br /&gt;then&lt;br /&gt;  insert(new AdultBusPass( $p ) );&lt;br /&gt;end&lt;/pre&gt;As before the above example is considered monolithic, leaky and providing poor separation of concerns.&lt;br /&gt;&lt;br /&gt;As before we can provide a more robust application with a separation of concerns using inference. Notice this time we don't just insert the inferred object, we use "logicalInsert":&lt;pre class="brush:drl"&gt;rule "Infer Child" when&lt;br /&gt;  $p : Person( age &lt; 16 )&lt;br /&gt;then&lt;br /&gt;    logicalInsert( new IsChild( $p ) )&lt;br /&gt;end&lt;br /&gt;rule "Infer Adult" when&lt;br /&gt;  $p : Person( age &gt;= 16 )&lt;br /&gt;then&lt;br /&gt;    logicalInsert( new IsAdult( $p ) )&lt;br /&gt;end&lt;/pre&gt;A "logicalInsert" is part of the Drools Truth Maintenance System (TMS). Here the fact is logically inserted, this fact is dependant on the truth of the "when" clause. It means that when the rule becomes false the fact is automatically retracted. This works particularly well as the two rules are mutually exclusive. So in the above rules if the person is under 16 it inserts an IsChild fact, once the person is 16 or over the IsChild fact is automatically retracted and the IsAdult fact inserted.&lt;br /&gt;&lt;br /&gt;We can now bring back in the code to issue the passes, these two can also be logically inserted, as the TMS supports chaining of logical insertions for a cascading set of retracts.&lt;pre class="brush:drl"&gt;rule "Issue Child Bus Pass" when&lt;br /&gt;  $p : Person( )&lt;br /&gt;       IsChild( person =$p )&lt;br /&gt;then&lt;br /&gt;  logicalInsert(new ChildBusPass( $p ) );&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;rule "Issue Adult Bus Pass" when&lt;br /&gt;  $p : Person( age &gt;= 16 )&lt;br /&gt;       IsAdult( person =$p )&lt;br /&gt;then&lt;br /&gt;  logicalInsert(new AdultBusPass( $p ) );&lt;br /&gt;end&lt;/pre&gt;Now when the person changes from being 15 to 16, not only is the IsChild fact automatically retracted, so is the person's ChildBusPass fact. For bonus points we can combine this with the 'not' conditional element to handle notifications, in this situation a request for the returning of the pass. So when the TMS automatically retracts the ChildBusPass object, this rule triggers and sends a request to the person:&lt;pre class="brush:drl"&gt;rule "Return ChildBusPass Request "when&lt;br /&gt;  $p : Person( )&lt;br /&gt;       not( ChildBusPass( person == $p ) )&lt;br /&gt;then&lt;br /&gt;    requestChildBusPass( $p );&lt;br /&gt;end&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5869426-7047181506928331806?l=blog.athico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=BbuYJS41FDc:GthcUCbIr5w:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=BbuYJS41FDc:GthcUCbIr5w:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=BbuYJS41FDc:GthcUCbIr5w:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=BbuYJS41FDc:GthcUCbIr5w:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=BbuYJS41FDc:GthcUCbIr5w:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=BbuYJS41FDc:GthcUCbIr5w:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=BbuYJS41FDc:GthcUCbIr5w:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=BbuYJS41FDc:GthcUCbIr5w:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=BbuYJS41FDc:GthcUCbIr5w:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=BbuYJS41FDc:GthcUCbIr5w:jWeZv7XsJd0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=jWeZv7XsJd0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DroolsRSS/~4/BbuYJS41FDc" height="1" width="1"/&gt;</description><link>http://feeds.athico.com/~r/DroolsRSS/~3/BbuYJS41FDc/drools-inference-and-truth-maintenance.html</link><author>noreply@blogger.com (Mark Proctor)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">10</thr:total><feedburner:origLink>http://blog.athico.com/2010/01/drools-inference-and-truth-maintenance.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5869426.post-1469022625304635391</guid><pubDate>Wed, 20 Jan 2010 20:21:00 +0000</pubDate><atom:updated>2010-01-20T20:24:46.828Z</atom:updated><category domain="http://www.blogger.com/atom/ns#">medical</category><category domain="http://www.blogger.com/atom/ns#">Drools</category><title>Drools : Towards computerizing intensive care sedation guidelines:design of a rule-based architecture for automated execution of clinical guidelines</title><description>&lt;a href="http://7thspace.com/headlines/331660/towards_computerizing_intensive_care_sedation_guidelinesdesign_of_a_rule_based_architecture_for_automated_executionof_clinical_guidelines.html"&gt;Towards computerizing intensive care sedation guidelines:design of a rule-based architecture for automated execution of clinical guidelines&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"The aim is to close the gap in communication between the IT and the medical domain. This leads to a less time-consuming and error-prone development phase and a shorter clinical evaluation phase.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Methods: A framework is proposed that semi-automatically translates a clinical guideline, expressed as an XML-based flow chart, into a Drools Rule Flow by employing semantic technologies such as ontologies and SWRL."&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5869426-1469022625304635391?l=blog.athico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=rfOEIK9w3s4:qxSEhF7UV7I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=rfOEIK9w3s4:qxSEhF7UV7I:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=rfOEIK9w3s4:qxSEhF7UV7I:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=rfOEIK9w3s4:qxSEhF7UV7I:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=rfOEIK9w3s4:qxSEhF7UV7I:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=rfOEIK9w3s4:qxSEhF7UV7I:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=rfOEIK9w3s4:qxSEhF7UV7I:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=rfOEIK9w3s4:qxSEhF7UV7I:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=rfOEIK9w3s4:qxSEhF7UV7I:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=rfOEIK9w3s4:qxSEhF7UV7I:jWeZv7XsJd0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=jWeZv7XsJd0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DroolsRSS/~4/rfOEIK9w3s4" height="1" width="1"/&gt;</description><link>http://feeds.athico.com/~r/DroolsRSS/~3/rfOEIK9w3s4/drools-towards-computerizing-intensive.html</link><author>noreply@blogger.com (Mark Proctor)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.athico.com/2010/01/drools-towards-computerizing-intensive.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5869426.post-8030628575676652970</guid><pubDate>Wed, 20 Jan 2010 11:53:00 +0000</pubDate><atom:updated>2010-01-20T18:55:45.981Z</atom:updated><category domain="http://www.blogger.com/atom/ns#">Presentation</category><category domain="http://www.blogger.com/atom/ns#">planner</category><category domain="http://www.blogger.com/atom/ns#">Drools</category><title>Drools JUG Lille 21st of Jan</title><description>I'm going to be at the Ch’ti JUG tomorrow the 21st of January doing a Drools talk:&lt;br /&gt;&lt;a href="http://chtijug.org/rendez-vous-le-21-janvier-drools-avec-cylande-et-luniversite-de-lille-1/"&gt;http://chtijug.org/rendez-vous-le-21-janvier-drools-avec-cylande-et-luniversite-de-lille-1/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Update: Geoffrey will do a Drools Planner talk too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5869426-8030628575676652970?l=blog.athico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=tZlJyEiYgLA:XsXAQhw2pbQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=tZlJyEiYgLA:XsXAQhw2pbQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=tZlJyEiYgLA:XsXAQhw2pbQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=tZlJyEiYgLA:XsXAQhw2pbQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=tZlJyEiYgLA:XsXAQhw2pbQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=tZlJyEiYgLA:XsXAQhw2pbQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=tZlJyEiYgLA:XsXAQhw2pbQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=tZlJyEiYgLA:XsXAQhw2pbQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=tZlJyEiYgLA:XsXAQhw2pbQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=tZlJyEiYgLA:XsXAQhw2pbQ:jWeZv7XsJd0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=jWeZv7XsJd0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DroolsRSS/~4/tZlJyEiYgLA" height="1" width="1"/&gt;</description><link>http://feeds.athico.com/~r/DroolsRSS/~3/tZlJyEiYgLA/drools-jug-lille-21st-of-jan.html</link><author>noreply@blogger.com (Mark Proctor)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.athico.com/2010/01/drools-jug-lille-21st-of-jan.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5869426.post-8998964371567428677</guid><pubDate>Mon, 18 Jan 2010 18:02:00 +0000</pubDate><atom:updated>2010-01-18T21:15:43.513Z</atom:updated><category domain="http://www.blogger.com/atom/ns#">OSGi</category><category domain="http://www.blogger.com/atom/ns#">Drools</category><title>Drools - OSGi Ready!</title><description>I've spent some time getting Drools OSGi ready, which was harder than I expected, especially as OSGi is new to me. Last night I finally got OSGi Declarative Services working with Drools. When you combine this with our Spring work, &lt;a href="http://blog.athico.com/2009/12/drools-spring-improvements.html"&gt;http://blog.athico.com/2009/12/drools-spring-improvements.html&lt;/a&gt;, it's great timing for the recent Spring DM announcement, &lt;a href="http://blog.springsource.com/2010/01/12/dm-server-project-moves-to-eclipse-org"&gt;http://blog.springsource.com/2010/01/12/dm-server-project-moves-to-eclipse-org&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;For those that don't know. OSGi is a dynamic module system for declarative services. So what does that mean? Each jar in OSGi is called a bundle and has it's own Classloader. Each bundle specifies the packages it exports (makes publicly available) and which packages it imports (external dependencies). OSGi will use this information to wire the classloaders of different bundles together; the key distinction is you don't specify what bundle you depend on, or have a single monolithic classpath, instead you specify your package import and version and OSGi attempts to satisfy this from available bundles.&lt;br /&gt;&lt;br /&gt;It also supports side by side versioning, so you can have multiple versions of a bundle installed and it'll wire up the correct one. Further to this Bundles can register services for other bundles to use. These services need initialisation, which can cause ordering problems - how do you make sure you don't consume a service before its registered?&lt;br /&gt;&lt;br /&gt;OSGi has a number of features to help with service composition and ordering. The two main ones are the programmatic ServiceTracker and the xml based Declarative Services. There are also other projects that help with this; &lt;a href="http://www.springsource.org/osgi"&gt;Spring DM&lt;/a&gt;, &lt;a href="http://felix.apache.org/site/apache-felix-ipojo.html"&gt;iPOJO&lt;/a&gt;, &lt;a href="http://gravity.sourceforge.net/servicebinder/"&gt;Gravity&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Each of the Drools factories is now also available as a FactoryService interface. You can either have OSGi inject those into a pojo, or retrieve them yourself from OSGi. I'll cover injection here. The below example injects the KnowledgeBuilderFacotryService, KnowledgeBaseFactoryService and ResourecFactoryService into the TestComponent pojo.&lt;pre class="brush:xml"&gt;&amp;lt;scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0"&amp;gt;&lt;br /&gt;&amp;lt;implementation class="testosgi.TestComponent"/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;reference bind="setKnowledgeBaseFactoryService"&lt;br /&gt;           unbind="unsetKnowledgeBaseFactoryService"&lt;br /&gt;           interface="org.drools.KnowledgeBaseFactoryService"&lt;br /&gt;           /&amp;gt;&lt;br /&gt;         &lt;br /&gt;&amp;lt;reference bind="setResourceFactoryService"&lt;br /&gt;           unbind="unsetResourceFactoryService"&lt;br /&gt;           interface="org.drools.io.ResourceFactoryService"&lt;br /&gt;           /&amp;gt;           &lt;br /&gt;         &lt;br /&gt;&amp;lt;reference bind="setKnowledgeBuilderFactoryService"&lt;br /&gt;           unbind="unsetKnowledgeBuilderFactoryService"&lt;br /&gt;           interface="org.drools.builder.KnowledgeBuilderFactoryService"&lt;br /&gt;           target="(org.drools.compiler.DecisionTableProvider=true)"  /&amp;gt;           &lt;br /&gt;&amp;lt;/scr:component&amp;gt;&lt;/pre&gt;The TestComponent will only be activated when all of the referenced services are available and injected into the pojo. You'll also notice the "target" attribute for the KnowledgeBuilderFactoryService. The reason for this is that OSGi DS has no built in way to declaratively say which optional services must be present to satisfy your component. As a work around I made any Drools service that has optional services set a property if/when the optional service is available. Filters can then be applied, via the target attribute, to make sure the Service is in a desired state before consuming it. And that is pretty much it :)&lt;br /&gt;&lt;br /&gt;Getting there wasn't so easy. The first step was in automating the build and packaging. To automate the build I used Peter Krien's &lt;a href="http://www.aqute.biz/Code/Bnd"&gt;BND &lt;/a&gt;tool. I found that BND would only automate the maven transitive dependencies by embedding them, so I did this first. This built a single Drools jar with all Drools jars and dependencies inside it. This straight away triggered ClassLoader issue, forcing me to rework how the Drools ClassLoader framework is configured. The issue here was that Drools uses the ClassLoader that you provide it when compiling DRLs, that means any runtime class loading is resolved against the ClassLoader the user provides. Because of the way OSGi works if the user was to provide a ClassLoader from their bundle, that ClassLoader would not be able to see internal classes to Drools itself. This meant I'd have the Drools bundles giving me ClassNotFoundExceptions for classes in it's own Bundle. The answer was to make a CompositeClassLoader that takes the provided user ClassLoader and combines it with the ClassLoaders of the Drools bundle's.&lt;br /&gt;&lt;br /&gt;With that now working the next issue was the monolithic bundle we now had. I first tried to separate drools-api, to give real api separation. This then triggered "split packages". This is one of those things that you wish the OSGi people would shout from the roof tops about to anyone hoping to be OSGi compatible in the future, as I had them all over the place. A split package is where you have the same package namespace used in different jars. drools-api and drools-core both have classes in the "org.drools" namespace. There is very little documentation on resolving split packages and the solution proposed in BND didn't seem to do anything for me. I read that I can use a "mandatory" setting with my exports, which should make my imports work, but I couldn't get that working either. Instead I moved away from "Package-Import" to "DynamicPackage-Import *" and "Require-Bundle", where I tied the Drools impl bundles to the api bundle and re-exported interfaces. This seemed to do the job, although the later are frowned upon, see &lt;a href="http://www.osgi.org/blog/2006/04/misconceptions-about-osgi-headers.html"&gt;here&lt;/a&gt;. "Require-Bundle" couples your bundle to a specific version, which means you aren't making the most of the more declarative nature of OSGi and "DynamicPackage-Import *" just sucks everything in, which apparently can lead to inefficiencies in OSGi, something called a "fan out". I have to admit this gets too low level for me, so if anyone wants to add more light on this in the comments, please do and I'll paste it into the end of this blog.&lt;br /&gt;&lt;br /&gt;The next step was to split up my monolithic Drools bundles back to their original jars and not to embed their dependencies. Variations on the following for the Drools modules seemed to work for me:&lt;pre class="brush:xml"&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt;   &amp;lt;manifestLocation&amp;gt;META-INF&amp;lt;/manifestLocation&amp;gt;&lt;br /&gt;   &amp;lt;instructions&amp;gt;&lt;br /&gt;       &amp;lt;_removeheaders&amp;gt;Ignore-Package&amp;lt;/_removeheaders&amp;gt;                   &lt;br /&gt;       &amp;lt;Require-Bundle&amp;gt;org.drools.api;visibility:=reexport;bundle-version="${pom.version}"&amp;lt;/Require-Bundle&amp;gt;&lt;br /&gt;       &amp;lt;Import-Package&amp;gt;!org.drools.*, *&amp;lt;/Import-Package&amp;gt;&lt;br /&gt;       &amp;lt;Export-Package&amp;gt;org.drools.*&amp;lt;/Export-Package&amp;gt;    &lt;br /&gt;       &amp;lt;DynamicImport-Package&amp;gt;*&amp;lt;/DynamicImport-Package&amp;gt;&lt;br /&gt;       &amp;lt;Bundle-Activator&amp;gt;org.drools.osgi.core.Activator&amp;lt;/Bundle-Activator&amp;gt;&lt;br /&gt;   &amp;lt;/instructions&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;/pre&gt;Because many of the Drools dependencies are not OSGi ready I turned to the Spring &lt;a href="http://www.springsource.com/repository/app/"&gt;repository&lt;/a&gt;, which repackages many projects with OSGi ready manifests in a Maven consumerable repository.&lt;br /&gt;&lt;br /&gt;The Activator element specifies the class to be called when each Bundle is loaded in OSGi. The Activator registers services and where optional services need to be tracked configures a ServiceTracker that updates the properties that the target attribute can filter on. This is the programmatic way to setup services in OSGi, compared to DS.&lt;br /&gt;&lt;br /&gt;I'm now in the process of OSGi-ifying the other Drools modules and trying to make it more robust. Thanks to Peter Kriens and the people on the #eclipse and #osgi irc channels for their patience with my questions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5869426-8998964371567428677?l=blog.athico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=oCqs-oNk00k:9AT8fR5eAfw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=oCqs-oNk00k:9AT8fR5eAfw:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=oCqs-oNk00k:9AT8fR5eAfw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=oCqs-oNk00k:9AT8fR5eAfw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=oCqs-oNk00k:9AT8fR5eAfw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=oCqs-oNk00k:9AT8fR5eAfw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=oCqs-oNk00k:9AT8fR5eAfw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=oCqs-oNk00k:9AT8fR5eAfw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=oCqs-oNk00k:9AT8fR5eAfw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=oCqs-oNk00k:9AT8fR5eAfw:jWeZv7XsJd0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=jWeZv7XsJd0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DroolsRSS/~4/oCqs-oNk00k" height="1" width="1"/&gt;</description><link>http://feeds.athico.com/~r/DroolsRSS/~3/oCqs-oNk00k/drools-osgi-ready.html</link><author>noreply@blogger.com (Mark Proctor)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.athico.com/2010/01/drools-osgi-ready.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5869426.post-902791512897780794</guid><pubDate>Mon, 04 Jan 2010 20:19:00 +0000</pubDate><atom:updated>2010-01-04T21:06:00.998Z</atom:updated><category domain="http://www.blogger.com/atom/ns#">Rete</category><category domain="http://www.blogger.com/atom/ns#">Drools</category><title>Rete and "True Modify"</title><description>The first commit for &amp;quot;true modify&amp;quot; is in, although we'll need to think of a better name for it. The branch doesn't fully compile, so you can't use maven. But it does compile enough to run examples that use just joins, not and exist nodes. Such as manners and waltz. And we've been extending the rete testing harness, &lt;a href="http://blog.athico.com/2009/11/rete-dsl-testing-harness.html"&gt;http://blog.athico.com/2009/11/rete-dsl-testing-harness.html&lt;/a&gt;,  to provide more thorough testing of these nodes. I'll blog this algorithm in more detail later:&lt;br /&gt;&lt;a href="http://fisheye.jboss.org/browse/JBossRules/branches/true_modify_20100104"&gt;http://fisheye.jboss.org/browse/JBossRules/branches/true_modify_20100104&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The crux of it is that a modify no longer is a stateless retract+assert. I use the term stateless here as all state is lost in the retract and all state is recreated in the assert, it's not easy to know the state changes between these two in a stateful manner.&lt;br /&gt;&lt;br /&gt;As an example of work arounds we have had to do, to determine those state changes, take the event model for activations. Drools has always provided activation normalisation, to make the events seem correct and for truth maintenance. When a modify happens we put all cancelled activations in a map, that happened as part of the retract, and remove all activations that are in the map that happaned as part of the assert. This way we can know what was really cancelled, stayed the same and added. While it creates a system users can more easily understand, it adds considerable overhead (about 10%) and complexity, to my knowledge Drools is the only PRD system that does this.&lt;br /&gt;&lt;br /&gt;The new algorithm does not do two propgations, a retract + assert, it instead does a single modify propagation. This propagation applies the constraint and determines what to do and how to continue:&lt;br /&gt;false before, true now = continue as assert&lt;br /&gt;true before, false now = continue as retract&lt;br /&gt;true before, true now = continue as modify&lt;br /&gt;false before, false now = do nothing&lt;br /&gt;&lt;br /&gt;Tradditional symetrical Rete implementations, such as in Drools 4, would not be able to do this http://blog.athico.com/2008/10/symmetrical-and-asymmetrical-rete.html. Because there is not enough state in the network to avoid the retract + assert. Drools 5.0 implements asymetrical Rete for tree based removal as mentioned in the Doorenbos's papers and based on the work of Gary Riley in Clips. In this algorithm every Tuple (Jess calls Tokens and Clips calls PartialMatch) knows which Tuples it was joined to and all resulting children, likewise each child knows it's parents. The implementation alone in Drools 5.0 was not enough to move straight to true modify and the data structures had to be changed, mostly around deterministic iteration. For perf Drools 5 and Clips would just reference the head of a list, we would iterate from the head and add to the head. For true modify the opposite node iterations must be in the same order as the child tuple iterations. To achieve that we need to keep a reference to both the head and the tail, we add to the tail and iterate from the head. Along with a few other additions that means we can now implement modify methods, as illustrated in the JoinNode modifyLeft&lt;pre class="brush:drl"&gt;&lt;br /&gt;public void modifyLeftTuple(final LeftTuple leftTuple,&lt;br /&gt;                            final PropagationContext context,&lt;br /&gt;                            final InternalWorkingMemory workingMemory) {&lt;br /&gt;    final BetaMemory memory = (BetaMemory) workingMemory.getNodeMemory( this );&lt;br /&gt;&lt;br /&gt;    // Add and remove to make sure we are in the right bucket and at the end&lt;br /&gt;    // this is needed to fix for indexing and deterministic iteration&lt;br /&gt;    memory.getLeftTupleMemory().remove( leftTuple );&lt;br /&gt;    memory.getLeftTupleMemory().add( leftTuple );&lt;br /&gt;&lt;br /&gt;    this.constraints.updateFromTuple( memory.getContext(),&lt;br /&gt;                                      workingMemory,&lt;br /&gt;                                      leftTuple );&lt;br /&gt;    LeftTuple childLeftTuple = leftTuple.firstChild;&lt;br /&gt;&lt;br /&gt;    RightTupleMemory rightMemory = memory.getRightTupleMemory();&lt;br /&gt;&lt;br /&gt;    RightTuple rightTuple = rightMemory.getFirst( leftTuple );&lt;br /&gt;&lt;br /&gt;    // first check our index (for indexed nodes only) hasn't changed and we are returning the same bucket&lt;br /&gt;    if ( childLeftTuple != null &amp;amp;&amp;amp; rightMemory.isIndexed() &amp;amp;&amp;amp; rightTuple != rightMemory.getFirst( childLeftTuple.getRightParent() ) ) {&lt;br /&gt;        // our index has changed, so delete all the previous propagations&lt;br /&gt;        this.sink.propagateRetractLeftTuple( leftTuple,&lt;br /&gt;                                             context,&lt;br /&gt;                                             workingMemory );&lt;br /&gt;&lt;br /&gt;        childLeftTuple = null; // null so the next check will attempt matches for new bucket&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // we can't do anything if RightTupleMemory is empty&lt;br /&gt;    if ( rightTuple != null ) {&lt;br /&gt;        if ( childLeftTuple == null ) {&lt;br /&gt;            // either we are indexed and changed buckets or&lt;br /&gt;            // we had no children before, but there is a bucket to potentially match, so try as normal assert&lt;br /&gt;            for ( ; rightTuple != null; rightTuple = (RightTuple) rightTuple.getNext() ) {&lt;br /&gt;                final InternalFactHandle handle = rightTuple.getFactHandle();&lt;br /&gt;                if ( this.constraints.isAllowedCachedLeft( memory.getContext(),&lt;br /&gt;                                                           handle ) ) {&lt;br /&gt;                    this.sink.propagateAssertLeftTuple( leftTuple,&lt;br /&gt;                                                        rightTuple,&lt;br /&gt;                                                        context,&lt;br /&gt;                                                        workingMemory,&lt;br /&gt;                                                        this.tupleMemoryEnabled );&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        } else {&lt;br /&gt;            // in the same bucket, so iterate and compare&lt;br /&gt;            for ( ; rightTuple != null; rightTuple = (RightTuple) rightTuple.getNext() ) {&lt;br /&gt;                final InternalFactHandle handle = rightTuple.getFactHandle();&lt;br /&gt;&lt;br /&gt;                if ( this.constraints.isAllowedCachedLeft( memory.getContext(),&lt;br /&gt;                                                           handle ) ) {&lt;br /&gt;                    if ( childLeftTuple != null &amp;amp;&amp;amp; childLeftTuple.getRightParent() != rightTuple ) {&lt;br /&gt;                        this.sink.propagateAssertLeftTuple( leftTuple,&lt;br /&gt;                                                            rightTuple,&lt;br /&gt;                                                            context,&lt;br /&gt;                                                            workingMemory,&lt;br /&gt;                                                            this.tupleMemoryEnabled );&lt;br /&gt;                    } else {&lt;br /&gt;                        // preserve the current LeftTuple, as we need to iterate to the next before re-adding&lt;br /&gt;                        LeftTuple temp = childLeftTuple;&lt;br /&gt;                        childLeftTuple = this.sink.propagateModifyChildLeftTuple( childLeftTuple,&lt;br /&gt;                                                                                  rightTuple,&lt;br /&gt;                                                                                  context,&lt;br /&gt;                                                                                  workingMemory,&lt;br /&gt;                                                                                  this.tupleMemoryEnabled );&lt;br /&gt;                        // we must re-add this to ensure deterministic iteration&lt;br /&gt;                        temp.reAddLeft();&lt;br /&gt;                    }&lt;br /&gt;                } else if ( childLeftTuple != null &amp;amp;&amp;amp; childLeftTuple.getRightParent() == rightTuple ) {&lt;br /&gt;                    childLeftTuple = this.sink.propagateRetractChildLeftTuple( childLeftTuple,&lt;br /&gt;                                                                               rightTuple,&lt;br /&gt;                                                                               context,&lt;br /&gt;                                                                               workingMemory );&lt;br /&gt;                }&lt;br /&gt;                // else do nothing, was false before and false now.&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    this.constraints.resetTuple( memory.getContext() );&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;The first thing you'll notice is that this is about third more code than retract+assert together, and there are additional logic tests to determine the before and after states. This combined with a small overhead addition in the data structures means that actually we aren't reducing the executed code statements, but increasing. What you'll notice though is that if there are no state changes, true before and true now, unlike retract+assert it avoids a Tuple creation. So for large conflict sets, where none or only a small proportion of the set changes we get much less or even no object creation and thus reduced load on the GC. In the past large systems with millions of facts using gigabytes of memory have had GC problems, where Drools is creating objects faster than standard GC can keep up with, causing OOME. The answer then was to tune the GC, to make it run more aggressively and more often. For those systems true modify should hopefully be a real advantage. Waltz and manners are small applications and are only marginally faster, most likely only due to the removal of the activation normalisation.&lt;br /&gt;&lt;br /&gt;But is it only large systems that will benefit? Not at all. Now that we have stateful modifications it opens up lots of new opportunities for optimisation. The biggest initial gain will be from the more functional programming aspects of Drools. When you use 'from' to nest and chain conditional elements and patterns you are using Drools in a functional way. Accumulates are like left folds, it iterates a set of data and produces a derived object which we filter with patterns or other conditional elements.&lt;pre class="brush:drl"&gt;&lt;br /&gt;$p : Person( location == &amp;quot;london&amp;quot; )&lt;br /&gt;accumulate( CashFlow( person == $p, type == &amp;quot;DEBIT&amp;quot;, $v : value ).&lt;br /&gt;            sum( $v ) )&lt;br /&gt;&lt;/pre&gt;If the Cashflows are all inserted first, the accumulation is triggered by the insertion of a Person. What happens if we change a field on the person, but not the location? In the functional world changes in values for a field are known as side effects. With the traditional Rete approach we have no way of knowing if the side effect can impact the results of the function, more than that the results are wiped away during the retract. With the modify we still have the result, we can then determine if the modified object or field can impact the accumulation, if it doesn't we can use the result as is, no need to recalculate. Some applications can chain many accumulations in a single rule, the savings in performance here are orders of magnitudes, Drools Planner (was solver) is such an application that will make big gains from this.&lt;br /&gt;&lt;br /&gt;Range optimisations, age &amp;gt; $v, normally use BTrees for indexing. If every modify is a retract+assert this would send the BTree rebalancing into over drive, negating any benefits. Now that we can avoid any unnecessary BTree manipulation, range indexing becomes a possibility for Join Nodes.&lt;br /&gt;&lt;br /&gt;We can analyse a rule and determine for each object change, at the point that it enters a rule which later nodes depend on this object. We can either avoid unnecessary checks and just propagate to the next node, or just avoid propagation all together. This can all help reduce the amount of work done during the matching phase.&lt;br /&gt;&lt;br /&gt;I'm not sure of any literature or other engines that implement this Rete enhancement, so if you know of anything please point me in the right direction.&lt;br /&gt;&lt;br /&gt;For a bit of historical information on Drools. In early 2.0 beta releases and in the Drools 3.0 final release there were attempts at "true modify". The approach in Drools 3.0 meant that each Tuple used Maps and Sets to keep references to matches and children. It worked, but performance was not scalable as memory use went through the roof. Which is why Drools 4.0 returned to a more traditional symmetrical Rete implementation. It's been a long sought for goal, that we haven't managed to get right in the past, but feel we are finally there. So I should add, other implementations or literature that worked in scalable way :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5869426-902791512897780794?l=blog.athico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=DbMruNmRy7A:rYg3o2_TdLc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=DbMruNmRy7A:rYg3o2_TdLc:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=DbMruNmRy7A:rYg3o2_TdLc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=DbMruNmRy7A:rYg3o2_TdLc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=DbMruNmRy7A:rYg3o2_TdLc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=DbMruNmRy7A:rYg3o2_TdLc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=DbMruNmRy7A:rYg3o2_TdLc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=DbMruNmRy7A:rYg3o2_TdLc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=DbMruNmRy7A:rYg3o2_TdLc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=DbMruNmRy7A:rYg3o2_TdLc:jWeZv7XsJd0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=jWeZv7XsJd0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DroolsRSS/~4/DbMruNmRy7A" height="1" width="1"/&gt;</description><link>http://feeds.athico.com/~r/DroolsRSS/~3/DbMruNmRy7A/rete-and-true-modify.html</link><author>noreply@blogger.com (Mark Proctor)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><feedburner:origLink>http://blog.athico.com/2010/01/rete-and-true-modify.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5869426.post-2087773486711129561</guid><pubDate>Mon, 28 Dec 2009 18:19:00 +0000</pubDate><atom:updated>2009-12-28T19:24:29.908Z</atom:updated><category domain="http://www.blogger.com/atom/ns#">traveling tournament</category><category domain="http://www.blogger.com/atom/ns#">solver</category><category domain="http://www.blogger.com/atom/ns#">planner</category><title>Planning the traveling tournament problem</title><description>&lt;p&gt;One of the older examples in Drools Planner is the Traveling Tournament Problem as defined by &lt;a href="http://mat.tepper.cmu.edu/TOURN/"&gt;Trick et al&lt;/a&gt;. I haven't improved/optimized on it much in the last couple of years, but recently I made a diagram to explain the problem more clearly:&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_DkCPgdrtcek/SzkFyJxbo-I/AAAAAAAAAFI/7P5pBd-2JsE/s1600-h/travelingTournamentUseCase.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_DkCPgdrtcek/SzkFyJxbo-I/AAAAAAAAAFI/7P5pBd-2JsE/s400/travelingTournamentUseCase.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5420369985691952098" /&gt;&lt;/a&gt;&lt;p&gt;We need to schedule matches between N teams while respecting the following hard constraints:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Each team plays twice against every other team: once home and once away.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Each team has exactly 1 match on each playing day.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;No team must have more than 3 consecutive home or 3 consecutive away matches.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;No repeaters: no 2 consecutive matches of the same 2 opposing teams.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;There's only one soft constraint:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Minimize the total distance traveled by all teams.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This might look like a really easy problem, but even for low N's (12 &lt;= N &lt;= 24) they haven't found (or at least proven) the optimal solution yet. &lt;a href="http://mat.tepper.cmu.edu/TOURN/"&gt;Regularly better solutions are found for the larger N's.&lt;/a&gt;&lt;/p&gt;&lt;p&gt; Still, those N's are embarrassingly small compared to real-world planning problems such as examination timetabling (N &gt;= 1000), shift rostering or bin packaging.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5869426-2087773486711129561?l=blog.athico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=C_5HfgZkcGs:1tzfqWBx2PU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=C_5HfgZkcGs:1tzfqWBx2PU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=C_5HfgZkcGs:1tzfqWBx2PU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=C_5HfgZkcGs:1tzfqWBx2PU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=C_5HfgZkcGs:1tzfqWBx2PU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=C_5HfgZkcGs:1tzfqWBx2PU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=C_5HfgZkcGs:1tzfqWBx2PU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=C_5HfgZkcGs:1tzfqWBx2PU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=C_5HfgZkcGs:1tzfqWBx2PU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=C_5HfgZkcGs:1tzfqWBx2PU:jWeZv7XsJd0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=jWeZv7XsJd0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DroolsRSS/~4/C_5HfgZkcGs" height="1" width="1"/&gt;</description><link>http://feeds.athico.com/~r/DroolsRSS/~3/C_5HfgZkcGs/planning-traveling-tournament-problem.html</link><author>noreply@blogger.com (Geoffrey De Smet)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_DkCPgdrtcek/SzkFyJxbo-I/AAAAAAAAAFI/7P5pBd-2JsE/s72-c/travelingTournamentUseCase.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.athico.com/2009/12/planning-traveling-tournament-problem.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5869426.post-2603192640899219474</guid><pubDate>Tue, 15 Dec 2009 23:52:00 +0000</pubDate><atom:updated>2009-12-16T00:25:14.627Z</atom:updated><category domain="http://www.blogger.com/atom/ns#">video</category><category domain="http://www.blogger.com/atom/ns#">Debug</category><category domain="http://www.blogger.com/atom/ns#">Drools Flow</category><title>Screencasts on some FAQ</title><description>We regularly see the same questions pop up on the mailing list or on our irc channel.  While we try to write documentation on how to do all these things, some things might be easier to explain using a quick example.  I have recently created screencast for two such issues.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Debugging your Drools application in Eclipse&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The Drools Eclipse plugin contains various debug views that allow you to do advanced debugging of your Drools application, showing the object in your session, the agenda, etc.  Check out &lt;a href="http://hudson.jboss.org/hudson/job/drools/lastSuccessfulBuild/artifact/trunk/target/docs/drools-expert/html/ch07.html#d0e6959"&gt;section 7.10&lt;/a&gt; of the Drools Expert documentation.  &lt;a href="http://people.redhat.com/kverlaen/Debug.swf"&gt;This screencast&lt;/a&gt; shows you how to get these debug views working for a simple Hello World rule.  It also shows how to use breakpoints inside a rule.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Domain-specific nodes in Drools Flow&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Drools Flow allows you to create your own &lt;a href="https://hudson.jboss.org/hudson/job/drools/lastSuccessfulBuild/artifact/trunk/target/docs/drools-flow/html/ch.Domain_Specific_Processes.html"&gt;domain-specific nodes&lt;/a&gt;.  Such nodes have their own icon, properties and possibly even a custom editor.  &lt;a href="http://people.redhat.com/kverlaen/DomainSpecificWorkItem.swf"&gt;This screencast&lt;/a&gt; shows how you can create your custom work item node, use it in your process, and then register a handler to execute it at runtime.&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5869426-2603192640899219474?l=blog.athico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=E3_I9wFLuz4:hMUievXra2I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=E3_I9wFLuz4:hMUievXra2I:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=E3_I9wFLuz4:hMUievXra2I:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=E3_I9wFLuz4:hMUievXra2I:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=E3_I9wFLuz4:hMUievXra2I:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=E3_I9wFLuz4:hMUievXra2I:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=E3_I9wFLuz4:hMUievXra2I:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=E3_I9wFLuz4:hMUievXra2I:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=E3_I9wFLuz4:hMUievXra2I:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=E3_I9wFLuz4:hMUievXra2I:jWeZv7XsJd0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=jWeZv7XsJd0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DroolsRSS/~4/E3_I9wFLuz4" height="1" width="1"/&gt;</description><link>http://feeds.athico.com/~r/DroolsRSS/~3/E3_I9wFLuz4/screencasts-on-some-faq.html</link><author>noreply@blogger.com (Kris Verlaenen)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.athico.com/2009/12/screencasts-on-some-faq.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5869426.post-4280314082287524554</guid><pubDate>Thu, 10 Dec 2009 01:45:00 +0000</pubDate><atom:updated>2009-12-10T02:13:06.545Z</atom:updated><category domain="http://www.blogger.com/atom/ns#">Drools</category><title>Cisco ANA - "Drools Inside" :)</title><description>The Cisco ANA PDF is online, showing their Drools integration for their &lt;a href="http://www.cisco.com/en/US/products/ps6776/index.html"&gt;Advanced Network Abstraction (ANA)&lt;/a&gt; product. You can download the &lt;a href="http://www.cisco.com/en/US/docs/net_mgmt/active_network_abstraction/3.5.1/administration/user/guide/ruleseng.pdf"&gt;PDF &lt;/a&gt;here. So maybe Cisco products should have a new badge "Drools Inside" :)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Jrhwx8X9P7g/SyBYFU61MPI/AAAAAAAAAZY/7nv1uwUMnCY/s1600-h/drools-cisco.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; width: 400px; height: 248px;" src="http://1.bp.blogspot.com/_Jrhwx8X9P7g/SyBYFU61MPI/AAAAAAAAAZY/7nv1uwUMnCY/s400/drools-cisco.png" alt="" id="BLOGGER_PHOTO_ID_5413423600637391090" border="0" /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;click to enlarge&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If anyone from Cisco reads my blog and wants to chat about Drools, feel free to contact me mproctor at gmail d0t com.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5869426-4280314082287524554?l=blog.athico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=R90tmpj5ijA:P6qrnJ35UOk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=R90tmpj5ijA:P6qrnJ35UOk:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=R90tmpj5ijA:P6qrnJ35UOk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=R90tmpj5ijA:P6qrnJ35UOk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=R90tmpj5ijA:P6qrnJ35UOk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=R90tmpj5ijA:P6qrnJ35UOk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=R90tmpj5ijA:P6qrnJ35UOk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=R90tmpj5ijA:P6qrnJ35UOk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=R90tmpj5ijA:P6qrnJ35UOk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=R90tmpj5ijA:P6qrnJ35UOk:jWeZv7XsJd0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=jWeZv7XsJd0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DroolsRSS/~4/R90tmpj5ijA" height="1" width="1"/&gt;</description><link>http://feeds.athico.com/~r/DroolsRSS/~3/R90tmpj5ijA/cisco-ana-drools-inside.html</link><author>noreply@blogger.com (Mark Proctor)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_Jrhwx8X9P7g/SyBYFU61MPI/AAAAAAAAAZY/7nv1uwUMnCY/s72-c/drools-cisco.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.athico.com/2009/12/cisco-ana-drools-inside.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5869426.post-192216056500316523</guid><pubDate>Wed, 09 Dec 2009 13:19:00 +0000</pubDate><atom:updated>2009-12-09T14:13:47.737Z</atom:updated><category domain="http://www.blogger.com/atom/ns#">DRL</category><category domain="http://www.blogger.com/atom/ns#">Drools</category><title>Calendar support with Drools</title><description>Last week I blogged about 'cron' and 'int' (interval) based timer support:&lt;br /&gt;&lt;a href="http://blog.athico.com/2009/12/cron-and-interval-based-timers-for-rule.html"&gt;"Cron and Interval based timers for rule firing and re-firing"&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This week I've added Calendaring support. Calendaring allows you to provide a Set of Calendar implementations that specify allowed and disallowed time segments. With this you could create a "week day" Calendar which would specify Monday to Friday as the included time segments, leaving Saturday and Sunday as not included. I can then specify that Calendar in a rule. Monday to Friday if the rule activates it will fire, over the weekend if the rule activates it will ignored.&lt;br /&gt;&lt;br /&gt;The Calendar api is modelled on &lt;a href="http://www.quartz-scheduler.org"&gt;Quartz &lt;/a&gt;:&lt;pre class="brush:java"&gt;public interface Calendar {    &lt;br /&gt;    boolean isTimeIncluded(long timestamp); &lt;br /&gt;}&lt;/pre&gt;Quartz provides several good Calendar implementations, so it makes sense to leverage those, for this we we provide an adapter helper method:&lt;pre class="brush:java"&gt;Calendar QuartzHelper.quartzCalendarAdapter(org.quartz.Calendar quartzCal)&lt;/pre&gt;Calendars are registered with the StatefulKnowledgeSession:&lt;pre class="brush:drl"&gt;ksession.getCalendars().set( "week day", weekDayCal );&lt;/pre&gt;Which means they can now be used in rules. They can be used in conjunction with normal rules and rules including timers.&lt;pre class="brush:drl"&gt;rule "weekdays are high priority"&lt;br /&gt;   calendars "weekday"&lt;br /&gt;when &lt;br /&gt;    Alarm()&lt;br /&gt;then&lt;br /&gt;    send( "priority high - we have an alarm );&lt;br /&gt;end &lt;br /&gt;&lt;br /&gt;rule "weekend are low priority"&lt;br /&gt;   calendars "weekend"&lt;br /&gt;when &lt;br /&gt;    Alarm()&lt;br /&gt;then&lt;br /&gt;    send( "priority low - we have an alarm );&lt;br /&gt;end&lt;/pre&gt;Now I can already imagine some of you are thinking, well that's kinda cool and it's nice the semantics of Calendars and a Calendaring api supported out of the box. But I could achieve much the same thing by asserting Calendars as facts, placing the Calendar constraint as the last pattern and it'll block activations that are not included in the required time. While this is true, it would not work with Timer based rules. As we can now do this:&lt;pre class="brush:drl"&gt;rule "weekdays are high priority"&lt;br /&gt;   calendars "weekday"&lt;br /&gt;   timer (int:0 1h)&lt;br /&gt;when &lt;br /&gt;    Alarm()&lt;br /&gt;then&lt;br /&gt;    send( "priority high - we have an alarm );&lt;br /&gt;end &lt;br /&gt;&lt;br /&gt;rule "weekend are low priority"&lt;br /&gt;   calendars "weekend"&lt;br /&gt;   timer (int:0 4h)&lt;br /&gt;when &lt;br /&gt;    Alarm()&lt;br /&gt;then&lt;br /&gt;    send( "priority low - we have an alarm );&lt;br /&gt;end&lt;/pre&gt;The above rules use an interval based timer, a cron timer is also supported. On weekdays while there is an alarm it will trigger the rule initially straight away (delay of 0) and then every hour. At the weekends it will trigger the rule every four hours. If we had inserted the Calendar as a fact, we'd have to find some additional way to re-trigger the evaluation. Calendars themselves do not have mutable state, instead it's more like a function that tells you if the specified date is included or not. While this is not impossible to solve, it's getting messy very quickly. You'll need additional trigger facts, that will force Calendar evaluation at required points in time, that are managed by your own scheduler. This way it's efficient (no network propagation), clear syntax and intent and works out of the box. I should add that it'll work out of the box with our simulation api, thanks to our unified clock implementation.&lt;br /&gt;&lt;br /&gt;So what we have now is conditional rule based timers and calendaring. The cool thing here is we can use this for Drools Flow, using it to start processes or trigger wait states. While process centric implementations do have timer and calendaring support, the conditional rule integration adds a whole new level of power to this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5869426-192216056500316523?l=blog.athico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=MaZhT0_cv9c:9RE0XmNNBdE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=MaZhT0_cv9c:9RE0XmNNBdE:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=MaZhT0_cv9c:9RE0XmNNBdE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=MaZhT0_cv9c:9RE0XmNNBdE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=MaZhT0_cv9c:9RE0XmNNBdE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=MaZhT0_cv9c:9RE0XmNNBdE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=MaZhT0_cv9c:9RE0XmNNBdE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=MaZhT0_cv9c:9RE0XmNNBdE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=MaZhT0_cv9c:9RE0XmNNBdE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=MaZhT0_cv9c:9RE0XmNNBdE:jWeZv7XsJd0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=jWeZv7XsJd0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DroolsRSS/~4/MaZhT0_cv9c" height="1" width="1"/&gt;</description><link>http://feeds.athico.com/~r/DroolsRSS/~3/MaZhT0_cv9c/last-week-i-blogged-about-cron-and-int.html</link><author>noreply@blogger.com (Mark Proctor)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.athico.com/2009/12/last-week-i-blogged-about-cron-and-int.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5869426.post-8955129743961535765</guid><pubDate>Mon, 07 Dec 2009 18:50:00 +0000</pubDate><atom:updated>2010-02-06T11:08:48.583Z</atom:updated><category domain="http://www.blogger.com/atom/ns#">video</category><category domain="http://www.blogger.com/atom/ns#">devoxx</category><category domain="http://www.blogger.com/atom/ns#">javapolis</category><category domain="http://www.blogger.com/atom/ns#">solver</category><category domain="http://www.blogger.com/atom/ns#">planner</category><title>Drools Planner (AKA Drools Solver) Devoxx presentation movie</title><description>Thanks to Parleys Beta, I am proud to present:&lt;br /&gt;&lt;b&gt;Examination timetabling with Drools Planner - the movie&lt;/b&gt;&lt;br /&gt;Actually, it's not as much a movie as it is a Devoxx 2009 presentation.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://beta.parleys.com/#st=5&amp;id=1714"&gt;Click here to watch it full screen at beta.parleys.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I made a few updates since the live presentation at Devoxx, such as the rename from Drools Solver to Drools Planner.&lt;br /&gt;&lt;br /&gt;Just before posting this blog, David alerted me of a small (but embarrassing) calculation mistake in one of the slides. Can you find it?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5869426-8955129743961535765?l=blog.athico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=TIsQ3mpSjBE:xaU3xuDZHWo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=TIsQ3mpSjBE:xaU3xuDZHWo:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=TIsQ3mpSjBE:xaU3xuDZHWo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=TIsQ3mpSjBE:xaU3xuDZHWo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=TIsQ3mpSjBE:xaU3xuDZHWo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=TIsQ3mpSjBE:xaU3xuDZHWo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=TIsQ3mpSjBE:xaU3xuDZHWo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=TIsQ3mpSjBE:xaU3xuDZHWo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=TIsQ3mpSjBE:xaU3xuDZHWo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=TIsQ3mpSjBE:xaU3xuDZHWo:jWeZv7XsJd0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=jWeZv7XsJd0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DroolsRSS/~4/TIsQ3mpSjBE" height="1" width="1"/&gt;</description><link>http://feeds.athico.com/~r/DroolsRSS/~3/TIsQ3mpSjBE/drools-planner-aka-drools-solver-devoxx.html</link><author>noreply@blogger.com (Geoffrey De Smet)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.athico.com/2009/12/drools-planner-aka-drools-solver-devoxx.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5869426.post-7942431471739300611</guid><pubDate>Thu, 03 Dec 2009 00:47:00 +0000</pubDate><atom:updated>2009-12-03T01:42:54.464Z</atom:updated><title>Some Tohu videos</title><description>Tohu is the project which ads Q&amp;amp;A and "smart form" intelligence on top of drools (and provides a very nice CSS stylable and embeddable jquery based ajax front end as well). (see project page &lt;a href="http://jboss.org/tohu"&gt;here&lt;/a&gt;). &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Some interesting demo videos made by solnet here explaining how it works: &lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; white-space: pre; "&gt;&lt;a href="http://www.youtube.com/watch?v=EhE-eAlTbjc"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Example 2 (spreadsheet to define Q&amp;amp;A) &lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:Arial, Helvetica, sans-serif;font-size:100%;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; white-space: pre;"&gt;&lt;a href="http://www.youtube.com/watch?v=Os_C1tJNuls"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Example 1&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/user/SolnetSolutions#p/a/u/2/LOHr0zB8yaM"&gt;Yet more !&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(In case you are wondering, the accent you can here is New Zealand - or Middle Earth as I prefer to refer to it - perhaps only NZ and Australian citizens can tell the difference between !). &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Enjoy !&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5869426-7942431471739300611?l=blog.athico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=7PCfCkGKm_I:2sbKLtfroXY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=7PCfCkGKm_I:2sbKLtfroXY:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=7PCfCkGKm_I:2sbKLtfroXY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=7PCfCkGKm_I:2sbKLtfroXY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=7PCfCkGKm_I:2sbKLtfroXY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=7PCfCkGKm_I:2sbKLtfroXY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=7PCfCkGKm_I:2sbKLtfroXY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=7PCfCkGKm_I:2sbKLtfroXY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?i=7PCfCkGKm_I:2sbKLtfroXY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~ff/DroolsRSS?a=7PCfCkGKm_I:2sbKLtfroXY:jWeZv7XsJd0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DroolsRSS?d=jWeZv7XsJd0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DroolsRSS/~4/7PCfCkGKm_I" height="1" width="1"/&gt;</description><link>http://feeds.athico.com/~r/DroolsRSS/~3/7PCfCkGKm_I/some-tohu-videos.html</link><author>noreply@blogger.com (Michael Neale)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.athico.com/2009/12/some-tohu-videos.html</feedburner:origLink></item></channel></rss>
