    001    /*
    002    @license.text@
    003     */
    004    package com.hammurapi.reasoning.tutorial;
    005
    006    import java.io.File;
    007    import java.util.ArrayList;
    008    import java.util.Collections;
    009    import java.util.List;
    010    import java.util.concurrent.Executor;
    011    import java.util.concurrent.PriorityBlockingQueue;
    012    import java.util.concurrent.ThreadPoolExecutor;
    013    import java.util.concurrent.TimeUnit;
    014    import java.util.concurrent.atomic.AtomicInteger;
    015
    016    import com.hammurapi.config.runtime.FactoryConfig;
    017    import com.hammurapi.reasoning.ExceptionHandler;
    018    import com.hammurapi.reasoning.ForwardReasoningSession;
    019    import com.hammurapi.reasoning.ReasoningException;
    020    import com.hammurapi.reasoning.impl.ForwardReasoningSessionFactoryImpl;
    021    import com.hammurapi.reasoning.tutorial.objectmodel.Child;
    022    import com.hammurapi.reasoning.tutorial.objectmodel.Person;
    023    import com.hammurapi.reasoning.tutorial.objectmodel.Relative;
    024    import com.hammurapi.reasoning.tutorial.objectmodel.Spouse;
    025    import com.hammurapi.util.CompositeContext;
    026    import com.hammurapi.util.DefaultContext;
    027    import com.hammurapi.util.SimpleMutableContext;
    028
    029    public class Tutorial {
    030
    031            /**
    032             * Infers relationships.
    033             * @throws ReasoningException
    034             */
    035            private static void putFacts(ForwardReasoningSession<Relative> session) throws ReasoningException {
    036
    037                    Person kate = new Person("Kate", 58, false);
    038                    Person victor = new Person("Victor", 63, true);
    039                    session.put(new Spouse(kate, victor));
    040
    041                    Person peter = new Person("Peter", 37, true);
    042                    session.put(new Child(peter, kate));
    043                    session.put(new Child(peter, victor));
    044
    045                    Person alison = new Person("Alison", 36, false);
    046                    session.put(new Spouse(peter, alison));
    047
    048                    Person lucy = new Person("Lucy", 17, false);
    049                    session.put(new Child(lucy, alison));
    050
    051                    Person nancy = new Person("Nancy", 14, false);
    052                    session.put(new Child(nancy, peter));
    053
    054                    Person dan = new Person("Dan", 7, true);
    055                    session.put(new Child(dan, peter));
    056                    session.put(new Child(dan, alison));
    057
    058                    Person audrey = new Person("Audrey", 4, false);
    059                    session.put(new Child(audrey, peter));
    060                    session.put(new Child(audrey, alison));
    061
    062                    Person tanya = new Person("Tanya", 31, false);
    063                    Person max = new Person("Max", 32, true);
    064                    session.put(new Spouse(tanya, max));
    065                    session.put(new Child(tanya, kate));
    066                    session.put(new Child(tanya, victor));
    067
    068                    Person vilma = new Person("Vilma", 14, false);
    069                    session.put(new Child(vilma, tanya));
    070
    071                    Person george = new Person("George", 10, true);
    072                    session.put(new Child(george, tanya));
    073
    074                    Person lisa = new Person("Lisa", 5, false);
    075                    session.put(new Child(lisa, tanya));
    076                    session.put(new Child(lisa, max));
    077            }
    078
    079            /**
    080             * Main method for the tutorial.
    081             * @param args The first argument is rule set URI.
    082             */
    083            public static void main(String[] args) throws Exception {
    084                    long factoryStart = System.currentTimeMillis();
    085                    System.out.println("Hammurapi rules tutorial");
    086
    087                    if (args.length!=1) {
    088                            System.out.println("Usage: java <options> biz.hammurapi.rules.tutorial.Tutorial <rule set file>");
    089                            System.exit(1);
    090                    }
    091
    092                    FactoryConfig factoryConfig = new FactoryConfig();
    093
    094                    final AtomicInteger commandCounter = new AtomicInteger();
    095
    096                    ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 15, 20, TimeUnit.SECONDS, new PriorityBlockingQueue<Runnable>()) {
    097                            @Override
    098                            public void execute(Runnable command) {
    099                                    commandCounter.incrementAndGet();
    100                                    super.execute(command);
    101                            }
    102                    };
    103
    104                    SimpleMutableContext sc = new SimpleMutableContext();
    105                    sc.register(Executor.class, executor);
    106
    107                    factoryConfig.setContext(new CompositeContext(new DefaultContext(Tutorial.class.getClassLoader(), null), sc));
    108
    109                    ForwardReasoningSessionFactoryImpl<Relative> factory = new ForwardReasoningSessionFactoryImpl<Relative>(new File(args[0]), factoryConfig);
    110
    111                    ForwardReasoningSession<Relative> session = factory.createSession(null);
    112
    113                    session.setExceptionHandler(new ExceptionHandler() {
    114
    115                            @Override
    116                            public void handleException(Exception e) throws Exception {
    117                                    System.out.println("Exception: "+e);
    118                            }
    119                    });
    120
    121                    System.out.println("Session created in "+(System.currentTimeMillis()-factoryStart));
    122                    long start = System.currentTimeMillis();
    123                    try {
    124                            putFacts(session);
    125                            session.executeRules();
    126
    127                            List<Relative> allFacts = new ArrayList<Relative>(session.getObjects());
    128                            Collections.sort(allFacts);
    129
    130                            System.out.println("Inference time "+(System.currentTimeMillis()-start)+" for "+allFacts.size()+" objects.");
    131                            System.out.println("Commands executed "+commandCounter.get());
    132                            System.out.println("=== All facts ===");
    133                            int factNo = 0;
    134    //                      int maxDepth = 0;
    135    //                      int maxCardinality = 0;
    136    //                      Object maxCardinalityFact = null;
    137                            Person lastSubject = null;
    138                            for (Relative fact: allFacts) {
    139                                    if (lastSubject==null || !lastSubject.equals(fact.getSubject())) {
    140                                            if (lastSubject!=null) {
    141                                                    System.out.println("---");
    142                                            }
    143                                            lastSubject = fact.getSubject();
    144                                    }
    145                                    System.out.println(++factNo+": "+fact);
    146    //                              int dc = 0;
    147    //                              for (Derivation<Object> d: session.getDerivations(fact)) {
    148    //                                      System.out.println(++dc+": "+d);
    149    //                                      maxDepth = Math.max(maxDepth, d.getDepth());
    150    //                                      int c = d.getCardinality();
    151    //                                      if (c>maxCardinality) {
    152    //                                              maxCardinality = c;
    153    //                                              maxCardinalityFact = fact;
    154    //                                      }
    155    //                              }
    156    //                              System.out.println("---");
    157                            }
    158
    159    //                      System.out.println("Max depth: "+maxDepth);
    160    //                      System.out.println("Max cardinality: "+maxCardinality);
    161    //
    162    //                      System.out.println("~~~ Max cardinality fact: "+maxCardinalityFact);
    163    //                      int dc = 0;
    164    //                      for (Derivation<Object> d: session.getDerivations(maxCardinalityFact)) {
    165    //                              System.out.println(++dc+": "+d);
    166    //                      }
    167    //                      System.out.println("---");
    168
    169                            // Exclude already known.
    170
    171                            // Derivations.
    172                    } finally {
    173                            session.close();
    174                    }
    175                    executor.shutdown();
    176            }
    177
    178    }