<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html; charset=ISO-8859-1"
http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
On 24/09/2010 23:54, Mark Proctor wrote:
<blockquote cite="mid:4C9D2C1D.3040301@codehaus.org" type="cite">
<meta content="text/html; charset=ISO-8859-1"
http-equiv="Content-Type">
Work looks good, I've applied the patch.<br>
<a moz-do-not-send="true" class="moz-txt-link-freetext"
href="https://jira.jboss.org/browse/JBRULES-2709">https://jira.jboss.org/browse/JBRULES-2709</a><br>
</blockquote>
There was a small bug with this patch which broke during
serialisation. ObjectTypeConfs are not marshalled, thus the
isTmsEnabled state was being lost. It now re-determines that state
during input marshalling.<br>
<br>
Mark<br>
<blockquote cite="mid:4C9D2C1D.3040301@codehaus.org" type="cite"> <br>
Mark<br>
On 24/09/2010 23:28, Mark Proctor wrote:
<blockquote cite="mid:4C9D2603.2090408@codehaus.org" type="cite">
<meta content="text/html; charset=ISO-8859-1"
http-equiv="Content-Type">
<title></title>
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>
<pre wrap=""><fieldset class="mimeAttachmentHeader"></fieldset>
_______________________________________________
rules-dev mailing list
<a moz-do-not-send="true" class="moz-txt-link-abbreviated" href="mailto:rules-dev@lists.jboss.org">rules-dev@lists.jboss.org</a>
<a moz-do-not-send="true" class="moz-txt-link-freetext" href="https://lists.jboss.org/mailman/listinfo/rules-dev">https://lists.jboss.org/mailman/listinfo/rules-dev</a>
</pre>
</blockquote>
<br>
<pre wrap="">
<fieldset class="mimeAttachmentHeader"></fieldset>
_______________________________________________
rules-dev mailing list
<a class="moz-txt-link-abbreviated" href="mailto:rules-dev@lists.jboss.org">rules-dev@lists.jboss.org</a>
<a class="moz-txt-link-freetext" href="https://lists.jboss.org/mailman/listinfo/rules-dev">https://lists.jboss.org/mailman/listinfo/rules-dev</a>
</pre>
</blockquote>
<br>
</body>
</html>