Package au.csiro.snorocket.core.concurrent

Source Code of au.csiro.snorocket.core.concurrent.TaxonomyWorker1

/**
* Copyright CSIRO Australian e-Health Research Centre (http://aehrc.com).
* All rights reserved. Use is subject to license terms and conditions.
*/
package au.csiro.snorocket.core.concurrent;

import java.util.Queue;
import java.util.concurrent.ConcurrentMap;

import au.csiro.snorocket.core.IFactory;
import au.csiro.snorocket.core.util.FastConceptHashSet;
import au.csiro.snorocket.core.util.IConceptMap;
import au.csiro.snorocket.core.util.IConceptSet;
import au.csiro.snorocket.core.util.IntIterator;

/**
*
* Creates equivalent and direct sets using a context.
*
* @author Alejandro Metke
*
*/
public class TaxonomyWorker1 implements Runnable {
   
    private final IConceptMap<Context> contextIndex;
   
    private final ConcurrentMap<Integer, IConceptSet> equiv;
   
    private final ConcurrentMap<Integer, IConceptSet> direc;
   
    private final IFactory factory;
   
    private final Queue<Integer> todo;
   
    /**
     *
     */
    public TaxonomyWorker1(IConceptMap<Context> contextIndex,
            ConcurrentMap<Integer, IConceptSet> equiv,
            ConcurrentMap<Integer, IConceptSet> direc, IFactory factory,
            Queue<Integer> todo) {
        this.contextIndex = contextIndex;
        this.equiv = equiv;
        this.direc = direc;
        this.factory = factory;
        this.todo = todo;
    }
   
    public void run() {
        while(true) {
            Integer aInt = todo.poll();
            if(aInt == null) break;
           
            // Get the context
            int a = aInt.intValue();
            Context ctx = contextIndex.get(a);
           
            // Ignore if virtual
            if(factory.isVirtualConcept(a)) continue;
           
            // For every non-virtual parent get its parents
            for (IntIterator it = ctx.getS().iterator(); it.hasNext(); ) {
                int c = it.next();
                if(factory.isVirtualConcept(c)) continue;
               
                if (c == IFactory.BOTTOM_CONCEPT) {
                    addToSet(equiv, a, c);
                    addToSet(equiv, c, a);
                    continue;
                }
               
                // TODO: why is the context for BOTTOM including TOP?
                if(a == IFactory.BOTTOM_CONCEPT && c == IFactory.TOP_CONCEPT) {
                    continue;
                }
               
                IConceptSet cs = contextIndex.get(c).getS();
                if(cs != null && cs.contains(a)) {
                    addToSet(equiv, a, c);
                } else {
                    boolean isDirect = true;
                    IConceptSet d = direc.get(a);
                    if (d != null) {
                        IConceptSet toRemove =
                                IConceptSet.FACTORY.createConceptSet();
                        for(IntIterator it2 = d.iterator(); it2.hasNext(); ) {
                            int b = it2.next();
                            IConceptSet bs = contextIndex.get(b).getS();
                            if (bs != null && bs.contains(c)) {
                                isDirect = false;
                                break;
                            }
                            if (cs != null && cs.contains(b)) {
                                toRemove.add(b);
                            }
                        }
                        d.removeAll(toRemove);
                    }
                    if (isDirect) {
                        addToSet(direc, a, c);
                    }
                }
            }
        }
    }
   
    public static void addToSet(ConcurrentMap<Integer, IConceptSet> set,
            int key, int val) {
        IConceptSet valSet = set.get(key);
        if(valSet == null) {
            IConceptSet temp = new FastConceptHashSet();
            valSet = set.putIfAbsent(key, temp);
            if(valSet == null) {
                temp.add(val);
            } else {
                valSet.add(val);
            }
        } else {
            valSet.add(val);
        }
    }

}
TOP

Related Classes of au.csiro.snorocket.core.concurrent.TaxonomyWorker1

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.