nice, is it working? I would like to see the changes in the commits..<div>Greetings.<br><br><div class="gmail_quote">On Mon, Sep 20, 2010 at 7:09 PM, Mark Proctor <span dir="ltr">&lt;<a href="mailto:mproctor@codehaus.org">mproctor@codehaus.org</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;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&#39;s working now.. all tests passing except for
      ReteooWorkingMemoryTest that does:<br>
      <br>
      <blockquote style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204, 204, 204);padding-left:1ex" class="gmail_quote">
                FactHandle fd = workingMemory.insert( string );<br>
        <br>
                assertEquals( 1,<br>
                              tms.getAssertMap().size() );<br>
      </blockquote>
      <div><br>
        Which is a good sign, since tms is now empty as long as you
        haven&#39;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&#39;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></div><div class="h5"><br>
    <blockquote type="cite">
      <div>
        <br>
        Cheers,<br>
        Leo.<br>
        <br>
         <br>
      </div>
      <br>
      <br>
      <div class="gmail_quote">On Mon, Sep 20, 2010 at 5:14 PM, Mark
        Proctor <span dir="ltr">&lt;<a 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&#39;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 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&#39;t  make it work due to the following
                situation:<br>
                <br>
                1) Current code seems to rely on the equality map to
                know that a logical insert (insertLogical) for an object
                that has already been regularly inserted (insert) should
                be ignored;<br>
              </blockquote>
            </div>
            You would need to lazily maintain an equality map. When the
            first logical insertion is done we will have to first
            populate that map from the Object Type Node set of
            FactHandles.<br>
            In the &quot;insert&quot; one of the first lines is:<br>
                        ObjectTypeConf typeConf =
            this.typeConfReg.getObjectTypeConf( this.entryPoint,<br>
                                                                                     

            object );<br>
            <br>
            So we get the ObjectTypeConf before we do anything with the
            object itself, and we can check if TMS is being maintained
            for that Object Type.
            <div><br>
              <blockquote type="cite"><br>
                2) If I apply the modifications that you suggested, from
                what I understood, things would start to be put in the
                equality map only when a logical insert is issued;<br>
                <br>
                *Problem*: How would I handle the situation described in
                item 1, if I don&#39;t have anything in the equality map at
                the moment a logical insert comes in and I have to
                &quot;lazily activate&quot; 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 &quot;memory&quot; 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&#39;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 &quot;equality&quot; 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&#39;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 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 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&#39;ll see one argument is whether it&#39;s
                          a logical insertion or not. You&#39;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&#39;s a logical insert.<br>
                        <br>
                        If I&#39;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&#39;re at your own risk.<br>
                        <br>
                        Ideas? I feel that I missed something :)<br>
                        <br>
                        Cheers,<br>
                        Leo.<br>
                        <br>
                        P.S.: I reached the conclusions above based on
                        the fact that LogicalAssertionTest started
                        failing after I did the changes you suggested.<br>
                        <br>
                         <br>
                      </div>
                      <div>
                        <div><font color="#888888"> </font><br>
                          <br>
                          <div class="gmail_quote">On Wed, Sep 15, 2010
                            at 3:47 PM, Mark Proctor <span dir="ltr">&lt;<a 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&#39;s all in DroolsCore.<br>
                                <br>
                                It&#39;s a 5 minute hack for me and then 15
                                minute unit writing test. But I thought
                                I&#39;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&#39;ll see one argument is
                                whether it&#39;s a logical insertion or not.
                                You&#39;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 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&#39;s
                                              name on it ;)<br>
                                              <br>
                                              <a 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 href="http://blog.athico.com/2010/08/left-and-right-unlinking-community.html" target="_blank">&quot;Left
                                                and Right Unlinking&quot;</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
                                              &quot;MaintainTMSOption&quot; which
                                              can be true or false. It&#39;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 &quot;ObjectTypeConf&quot;
                                              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 &quot;churn&quot;
                                              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 href="mailto:rules-dev@lists.jboss.org" target="_blank">rules-dev@lists.jboss.org</a><br>
                                            <a 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 href="mailto:rules-dev@lists.jboss.org" target="_blank">rules-dev@lists.jboss.org</a>
<a 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 href="mailto:rules-dev@lists.jboss.org" target="_blank">rules-dev@lists.jboss.org</a><br>
                              <a 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>

<br>_______________________________________________<br>
rules-dev mailing list<br>
<a href="mailto:rules-dev@lists.jboss.org">rules-dev@lists.jboss.org</a><br>
<a 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><br clear="all"><br>-- <br> - CTO @ <a href="http://www.plugtree.com">http://www.plugtree.com</a>  <br> - MyJourney @ <a href="http://salaboy.wordpress.com">http://salaboy.wordpress.com</a><br>
 - Co-Founder @ <a href="http://www.jbug.com.ar">http://www.jbug.com.ar</a><br> <br> - Salatino &quot;Salaboy&quot; Mauricio -<br>
</div>