<!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">&lt;<a moz-do-not-send="true"
            href="mailto:mproctor@codehaus.org">mproctor@codehaus.org</a>&gt;</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"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                  FactHandle fd = workingMemory.insert( string );<br>
                  <br>
                  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assertEquals( 1,<br>
                  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 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>
                    &nbsp;<br>
                  </div>
                  <br>
                  <br>
                  <div class="gmail_quote">On Mon, Sep 20, 2010 at 5:14
                    PM, Mark Proctor <span dir="ltr">&lt;<a
                        moz-do-not-send="true"
                        href="mailto:mproctor@codehaus.org"
                        target="_blank">mproctor@codehaus.org</a>&gt;</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&nbsp; 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>
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ObjectTypeConf typeConf =
                        this.typeConfReg.getObjectTypeConf(
                        this.entryPoint,<br>
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;


                        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&lt;ObjectType, ObjectTypeNode&gt; 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">&lt;<a
                                    moz-do-not-send="true"
                                    href="mailto:leonardo.f.gomes@gmail.com"
                                    target="_blank">leonardo.f.gomes@gmail.com</a>&gt;</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>
                                    &nbsp;<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">&lt;<a
                                            moz-do-not-send="true"
                                            href="mailto:mproctor@codehaus.org"
                                            target="_blank">mproctor@codehaus.org</a>&gt;</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">&lt;<a
moz-do-not-send="true" href="mailto:mproctor@codehaus.org"
                                                          target="_blank">mproctor@codehaus.org</a>&gt;</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>