Hi,<br><br>I implemented the test cases you suggested, Mark, and started
working on the counter. I discussed a bit with Edson yesterday and he
clarified the difference between the counter for logically inserted
facts and the fact id counter. This part seems to be fine, but I have a
problem with the following scenario:<br><br>After an initial activation
of TMS I put everything in the equality map, then, due to retractions,
the counter gets back to zero and I have to disable TMS for that
specific type. When a new fact is logically inserted I have to look at
the OTN memory and get everything that was inserted there since the last
deactivation of TMS, to be be able to re-enable it. To do so I use the
fact handle id that I'm supposed to have stored together with the
counter. Fine.<br><br><b>Problem: </b>Since the OTN memory is an
ObjectHashSet, I will have to iterate through it and filter (there's an
ObjectFilter interface that I think I can implement) all the elements
that have id greater than the one I stored. This will probably be
inefficient and still likely to cause churn.<br><br><b>Possible solutions:</b><br>
<br>
1) Use a TreeMap? ** Don't think so, HashSet retrieval and insertion is O(1), on average, whereas TreeMap is O(log(n));<br>
<br>
2) Use a LinkedHashSet (probably a homegrown implementation on top of
ObjectHashSet)? ** Would allow me to get the ObjectEntry I want and then
call getNext() up to the end, inserting all of them in the equality
map;<br>
<br>
3) Never disable TMS for a given type once it has been enabled? ** I
think that lazily enabling TMS per type might be already enough an
optimization, in a sense that the overhead with the calculation of the
delta and all this logic to disable/re-enable might not be worthy.
Moreover, switching from HashSet to LinkedHashSet may have some
disadvantages.<br><br>
What do you think?<br>
<br>
Cheers,<br>
Leo.<br><br><br><div class="gmail_quote">On Tue, Sep 21, 2010 at 12:09 AM, Mark Proctor <span dir="ltr"><<a href="mailto:mproctor@codehaus.org">mproctor@codehaus.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<div bgcolor="#ffffff" text="#000000"><div class="im">
On 20/09/2010 21:58, Leonardo Gomes wrote:
<blockquote type="cite">Ok, it took me much longer that I had thought, but I
think it's working now.. all tests passing except for
ReteooWorkingMemoryTest that does:<br>
<br>
<blockquote style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;" class="gmail_quote">
FactHandle fd = workingMemory.insert( string );<br>
<br>
assertEquals( 1,<br>
tms.getAssertMap().size() );<br>
</blockquote>
<div><br>
Which is a good sign, since tms is now empty as long as you
haven't done any logical insert :)<br>
<br>
I implemented just the first part of your suggestion, with a
boolean. I will try to implement the solution with the counter
later this week and maybe do some adjustments before submitting
a patch.<br>
<br>
Do you have any suggestion in terms of unit tests that you would
like to see or just the apparent lack of regressions is enough?
Well, I can also think of some tests by taking
ReteooWorkingMemoryTest as an example, in case you don't have
anything particular in mind.<br>
</div>
</blockquote></div>
When you do some insertions cast to get some of the internal data
structures and check the equality map is null, maybe check the OT
confs are false, do a logical insertion check it can turn on for
specific OTNs and not all and that it correctly adds all objects for
the OTN. This will be important for the next stage of the work.<br><font color="#888888">
<br>
Mark</font><div><div></div><div class="h5"><br>
<blockquote type="cite">
<div>
<br>
Cheers,<br>
Leo.<br>
<br>
<br>
</div>
<br>
<br>
<div class="gmail_quote">On Mon, Sep 20, 2010 at 5:14 PM, Mark
Proctor <span dir="ltr"><<a href="mailto:mproctor@codehaus.org" target="_blank">mproctor@codehaus.org</a>></span>
wrote:<br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<div bgcolor="#ffffff" text="#000000">
<div> On 20/09/2010 15:53, Leonardo Gomes wrote:
<blockquote type="cite">I think I wasn't quite clear in my
last email, so let me try to reformulate it:<br>
<br>
I also gave it a try to try to do what you suggested
here (<a href="http://blog.athico.com/2010/09/lazily-enabled-truth-maintenace.html" target="_blank">http://blog.athico.com/2010/09/lazily-enabled-truth-maintenace.html</a>),
Mark, and couldn't make it work due to the following
situation:<br>
<br>
1) Current code seems to rely on the equality map to
know that a logical insert (insertLogical) for an object
that has already been regularly inserted (insert) should
be ignored;<br>
</blockquote>
</div>
You would need to lazily maintain an equality map. When the
first logical insertion is done we will have to first
populate that map from the Object Type Node set of
FactHandles.<br>
In the "insert" one of the first lines is:<br>
ObjectTypeConf typeConf =
this.typeConfReg.getObjectTypeConf( this.entryPoint,<br>
object );<br>
<br>
So we get the ObjectTypeConf before we do anything with the
object itself, and we can check if TMS is being maintained
for that Object Type.
<div><br>
<blockquote type="cite"><br>
2) If I apply the modifications that you suggested, from
what I understood, things would start to be put in the
equality map only when a logical insert is issued;<br>
<br>
*Problem*: How would I handle the situation described in
item 1, if I don't have anything in the equality map at
the moment a logical insert comes in and I have to
"lazily activate" TMS?<br>
</blockquote>
</div>
final Rete source = this.ruleBase.getRete(); <br>
ClassObjectType cot = new ClassObjectType( MyClass.class );<br>
Map<ObjectType, ObjectTypeNode> map =
source.getObjectTypeNodes( EntryPoint.DEFAULT );<br>
ObjectTypeNode node = map.get( cot );<br>
final ObjectHashSet memory = (ObjectHashSet)
workingMemory.getNodeMemory( node );<br>
<br>
That "memory" is the set of currently asserted objects for
that OTN. You can now iterate that and populate the equality
hash map. This is a one off as the flag will be set on the
ObjectTypeConf from then on and all objects will be added to
the equality map at the point of insertion.<br>
<br>
Does that help? All the information is there, you should
have to know how to retrieve it :) We don't currently
maintain TMS for anything other than the default entry
point. Although I think that was a mistake and we will
probably move all entrypoints to work with same, but for now
you can ignore that and just focus on the default.<br>
<br>
Btw this should not be confused with "equality" mode where
the equality map has to be maintained by default from the
start. Some would argue that a rule engine should only under
work and understand on the bases of equality and thus all
users must implement hashcode and equals correctly... <br>
<div>
<blockquote type="cite"><br>
--<br>
<br>
Moreover, I'm willing to attempt to implement the left
and right un-linking and tried to start with this easier
task to start to get familiar with drools-core. I
already read the article you linked and your article.
Would you have any document with an overview of the way
drools implements rete?<br>
</blockquote>
</div>
not really no, Rete has already well documented in a number
of papers. The best thing to do is get onto irc and talk
directly to edson and I and we can walk you through classes.<br>
<a href="http://www.jboss.org/drools/irc.html" target="_blank">http://www.jboss.org/drools/irc.html</a><br>
<font color="#888888"> <br>
Mark</font>
<div>
<div><br>
<blockquote type="cite"> <br>
Thanks in advance!<br>
<br>
Cheers,<br>
Leo.<br>
<br>
<br>
<br>
<br>
<br>
<br>
<div class="gmail_quote">On Sat, Sep 18, 2010 at 3:49
AM, Leonardo Gomes <span dir="ltr"><<a href="mailto:leonardo.f.gomes@gmail.com" target="_blank">leonardo.f.gomes@gmail.com</a>></span>
wrote:<br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<div>
<blockquote style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;" class="gmail_quote"> if
you look at the AbstractWorkingMemory insert
method you'll see one argument is whether it's
a logical insertion or not. You'll also see it
check the global maintainTMS configuration and
also retrieve the ObjectTypeConf. So between
those things someone should be able to get it
working.<br>
</blockquote>
</div>
<div><br>
Today, it enters a block where it operates on
the equality map and also creates a default
handle based on that TMS global option and
*regardless* of whether it's a logical insert.<br>
<br>
If I'm *not* putting things in the equality map
for regular inserts, when a logical insert comes
in, but there were already stated inserts, how
will I know that? I would create a new handle
for the logical insert and do the
tms.addLogicalDependency(...), even tough there
were regular inserts before and this seems to be
a wrong behaviour.<br>
<br>
Apparently, today, you can disable TMS and still
use logical inserts in your drl, what, I
believe, will lead to inconsistent behaviour,
but you're at your own risk.<br>
<br>
Ideas? I feel that I missed something :)<br>
<br>
Cheers,<br>
Leo.<br>
<br>
P.S.: I reached the conclusions above based on
the fact that LogicalAssertionTest started
failing after I did the changes you suggested.<br>
<br>
<br>
</div>
<div>
<div><font color="#888888"> </font><br>
<br>
<div class="gmail_quote">On Wed, Sep 15, 2010
at 3:47 PM, Mark Proctor <span dir="ltr"><<a href="mailto:mproctor@codehaus.org" target="_blank">mproctor@codehaus.org</a>></span>
wrote:<br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<div bgcolor="#ffffff" text="#000000">
<div> On 15/09/2010 14:35, Michael
Anstis wrote:
<blockquote type="cite">Is this in
drools-core; or drools-compiler?
<div><br>
</div>
<div>Whilst not undertaking to do
the work; have a purpose to nose
through the code makes
understanding easier.<br>
</div>
</blockquote>
</div>
It's all in DroolsCore.<br>
<br>
It's a 5 minute hack for me and then 15
minute unit writing test. But I thought
I'd write it up in a hope to bring
someone else into the fold, we need more
help writting the core engine someone
else out there must want to work on
current edge engine design :)<br>
<br>
if you look at the AbstractWorkingMemory
insert method you'll see one argument is
whether it's a logical insertion or not.
You'll also see it check the global
maintainTMS configuration and also
retrieve the ObjectTypeConf. So between
those things someone should be able to
get it working.<br>
<font color="#888888"> <br>
Mark</font>
<div>
<div><br>
<blockquote type="cite">
<div><br>
<div class="gmail_quote">On 14
September 2010 16:47, Mark
Proctor <span dir="ltr"><<a href="mailto:mproctor@codehaus.org" target="_blank">mproctor@codehaus.org</a>></span>
wrote:<br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<div bgcolor="#ffffff" text="#000000"> Here is
another project proposal,
this time simpler. I think
this one has Wolfgang's
name on it ;)<br>
<br>
<a href="http://blog.athico.com/2010/09/lazily-enabled-truth-maintenace.html" target="_blank">http://blog.athico.com/2010/09/lazily-enabled-truth-maintenace.html</a><br>
<br>
Three weeks ago I posted
the project idea for <a href="http://blog.athico.com/2010/08/left-and-right-unlinking-community.html" target="_blank">"Left
and Right Unlinking"</a>.
So far there are no
takers, so if you are
interested let me know :)<br>
<br>
In the meantime I tried to
think of a simpler
enhancement that we would
like to see done.<br>
<br>
At the moment Drools has a
user setting
"MaintainTMSOption" which
can be true or false. It's
a small optimisation that
when turned off avoids
using the equality hashmap
that is maintained for all
inserted objects.<br>
<br>
It would be a much better
idea to remove this
configuration setting,
thus simplifying things
for end users and have TMS
lazily enabled on demand.<br>
<br>
For each object type there
is an "ObjectTypeConf"
configuration object that
is retrieved every time a
working memory action,
such as insert, is
executed. The enabledTMS
boolean should be moved
there, so there is one per
object type, by default it
is false.<br>
<br>
When a working memory
action occurs, like
insert, it retrieved the
ObjectTypeConf and checks
the maintainTms boolean
there, instead of the
current engine scoped
configuration. When a
logical insertion occurs
and the ObjectTypeConf is
retrieved if maintainTms
is false it sets the value
to true and then iterates
the associated
ObjectTypeNode memory
lazily adding all the
objects to the TMS
equality map. From then on
for that ObjectType all
inserted objects are added
to that equality map.<br>
<br>
With this you now have the
advantage of TMS being
laziy enabled, so the
minor hashmap operation is
no longer used and
likewise a small memory
saving from not populating
the map. There is a
further advantage that
this is now fine grained
and when enabled only
impacts for that specific
object type.<br>
<br>
A further enhancement
could use a int counter,
instead of a boolean. Each
logical insertion for that
object type increases the
counter, each retraction
decreases the counter;
even if automatically
retracted if the truth is
broken for that logical
assertion. When the
counter reaches zero, TMS
for that OTN can be
disabled. We do not
however remove the objects
from the equality map, as
this would cause "churn"
if TMS is continuously
enabled and disabled.
Instead when TMS is
disabled record the
current fact counter id.
Then if TMS is disabled on
a retraction but there is
a counter id, we can check
that counter id to see if
the fact is prior to TMS
being disabled and thus
would need to be retracted
from the equality map.<br>
</div>
<br>
_______________________________________________<br>
rules-dev mailing list<br>
<a href="mailto:rules-dev@lists.jboss.org" target="_blank">rules-dev@lists.jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/rules-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/rules-dev</a><br>
<br>
</blockquote>
</div>
<br>
</div>
<pre><fieldset></fieldset>
_______________________________________________
rules-dev mailing list
<a href="mailto:rules-dev@lists.jboss.org" target="_blank">rules-dev@lists.jboss.org</a>
<a href="https://lists.jboss.org/mailman/listinfo/rules-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/rules-dev</a>
</pre>
</blockquote>
<br>
</div>
</div>
</div>
<br>
_______________________________________________<br>
rules-dev mailing list<br>
<a href="mailto:rules-dev@lists.jboss.org" target="_blank">rules-dev@lists.jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/rules-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/rules-dev</a><br>
<br>
</blockquote>
</div>
<br>
</div>
</div>
</blockquote>
</div>
<br>
</blockquote>
<br>
</div>
</div>
</div>
</blockquote>
</div>
<br>
</blockquote>
<br>
</div></div></div>
</blockquote></div><br>