<!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">
    Work looks good, I've applied the patch.<br>
    <a class="moz-txt-link-freetext" href="https://jira.jboss.org/browse/JBRULES-2709">https://jira.jboss.org/browse/JBRULES-2709</a><br>
    <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">&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>
      <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>