You're not alone in wanting to see the changes...
It'd be good if Leo would be willing to post his experience as a comment
on the original blog
http://blog.athico.com/2010/09/lazily-enabled-truth-maintenace.html
It might help others wanting to get involved.
________________________________
From: rules-dev-bounces(a)lists.jboss.org
[mailto:rules-dev-bounces@lists.jboss.org] On Behalf Of Mauricio
Salatino
Sent: 20 September 2010 23:18
To: Rules Dev List
Subject: Re: [rules-dev] Lazily Enabled Truth Maintenace
(Project Propsoal)
nice, is it working? I would like to see the changes in the
commits..
Greetings.
On Mon, Sep 20, 2010 at 7:09 PM, Mark Proctor
<mproctor(a)codehaus.org> wrote:
On 20/09/2010 21:58, Leonardo Gomes wrote:
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:
FactHandle fd =
workingMemory.insert( string );
assertEquals( 1,
tms.getAssertMap().size() );
Which is a good sign, since tms is now empty as
long as you haven't done any logical insert :)
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.
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.
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.
Mark
Cheers,
Leo.
On Mon, Sep 20, 2010 at 5:14 PM, Mark Proctor
<mproctor(a)codehaus.org> wrote:
On 20/09/2010 15:53, Leonardo Gomes
wrote:
I think I wasn't quite clear in my last
email, so let me try to reformulate it:
I also gave it a try to try to do what
you suggested here
(
http://blog.athico.com/2010/09/lazily-enabled-truth-maintenace.html),
Mark, and couldn't make it work due to the following situation:
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;
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.
In the "insert" one of the first lines
is:
ObjectTypeConf typeConf =
this.typeConfReg.getObjectTypeConf( this.entryPoint,
object );
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.
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;
*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?
final Rete source =
this.ruleBase.getRete();
ClassObjectType cot = new
ClassObjectType( MyClass.class );
Map<ObjectType, ObjectTypeNode> map =
source.getObjectTypeNodes( EntryPoint.DEFAULT );
ObjectTypeNode node = map.get( cot );
final ObjectHashSet memory =
(ObjectHashSet) workingMemory.getNodeMemory( node );
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.
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.
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...
--
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?
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.
http://www.jboss.org/drools/irc.html
Mark
Thanks in advance!
Cheers,
Leo.
On Sat, Sep 18, 2010 at 3:49 AM,
Leonardo Gomes <leonardo.f.gomes(a)gmail.com> wrote:
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.
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.
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.
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.
Ideas? I feel that I missed something :)
Cheers,
Leo.
P.S.: I reached the conclusions above
based on the fact that LogicalAssertionTest started failing after I did
the changes you suggested.
On Wed, Sep 15, 2010 at 3:47 PM, Mark
Proctor <mproctor(a)codehaus.org> wrote:
On 15/09/2010 14:35, Michael Anstis
wrote:
Is this in drools-core; or
drools-compiler?
Whilst not undertaking to do the work;
have a purpose to nose through the code makes understanding easier.
It's all in DroolsCore.
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 :)
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.
Mark
On 14 September 2010 16:47, Mark Proctor
<mproctor(a)codehaus.org> wrote:
Here is another project proposal, this
time simpler. I think this one has Wolfgang's name on it ;)
http://blog.athico.com/2010/09/lazily-enabled-truth-maintenace.html
Three weeks ago I posted the project
idea for "Left and Right Unlinking"
<
http://blog.athico.com/2010/08/left-and-right-unlinking-community.html>
. So far there are no takers, so if you are interested let me know :)
In the meantime I tried to think of a
simpler enhancement that we would like to see done.
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.
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.
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.
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.
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.
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.
_______________________________________________
rules-dev mailing list
rules-dev(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-dev
_______________________________________________
rules-dev mailing list
rules-dev(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-dev
_______________________________________________
rules-dev mailing list
rules-dev(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-dev
_______________________________________________
rules-dev mailing list
rules-dev(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-dev
--
- CTO @
http://www.plugtree.com
- MyJourney @
http://salaboy.wordpress.com
- Co-Founder @
http://www.jbug.com.ar
- Salatino "Salaboy" Mauricio -