<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html; charset=ISO-8859-1"
http-equiv="Content-Type">
<title></title>
</head>
<body bgcolor="#ffffff" text="#000000">
On 23/09/2010 13:44, Leonardo Gomes wrote:
<blockquote
cite="mid:AANLkTikuWLRUwW9U+go6-CmVguHaOaz_gc3=yT+2m0cP@mail.gmail.com"
type="cite">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>
</blockquote>
Lets get it working with just lazy enabling to begin with, so for
now it can't be disabled once enabled. Once that is working we can
look into how we can make it disable and decide if it's worth doing
or not.<br>
<br>
Mark<br>
<blockquote
cite="mid:AANLkTikuWLRUwW9U+go6-CmVguHaOaz_gc3=yT+2m0cP@mail.gmail.com"
type="cite"><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 moz-do-not-send="true"
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 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
moz-do-not-send="true"
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 moz-do-not-send="true"
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 moz-do-not-send="true"
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
moz-do-not-send="true"
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
moz-do-not-send="true"
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
moz-do-not-send="true" 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
moz-do-not-send="true"
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
moz-do-not-send="true"
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
moz-do-not-send="true"
href="mailto:rules-dev@lists.jboss.org" target="_blank">rules-dev@lists.jboss.org</a><br>
<a
moz-do-not-send="true"
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 moz-do-not-send="true" href="mailto:rules-dev@lists.jboss.org" target="_blank">rules-dev@lists.jboss.org</a>
<a moz-do-not-send="true" 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 moz-do-not-send="true"
href="mailto:rules-dev@lists.jboss.org"
target="_blank">rules-dev@lists.jboss.org</a><br>
<a moz-do-not-send="true"
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>
</blockquote>
<br>
</body>
</html>