aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/viatra-runtime/src/main/java/tools/refinery/viatra/runtime/matchers/psystem/ITypeConstraint.java
blob: b72035a86665096648583a462cccdeaca4759984 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/*******************************************************************************
 * Copyright (c) 2010-2015, Bergmann Gabor, Istvan Rath and Daniel Varro
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-v20.html.
 * 
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/
package tools.refinery.viatra.runtime.matchers.psystem;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Map.Entry;

import tools.refinery.viatra.runtime.matchers.context.IInputKey;
import tools.refinery.viatra.runtime.matchers.context.IQueryMetaContext;
import tools.refinery.viatra.runtime.matchers.tuple.Tuple;

import java.util.Set;

/**
 * Common superinterface of enumerable and deferred type constraints.
 * @author Bergmann Gabor
 *
 */
public interface ITypeConstraint extends ITypeInfoProviderConstraint {

    public abstract TypeJudgement getEquivalentJudgement();
    
    /**
     * Static internal utility class for implementations of {@link ITypeConstraint}s.
     * @author Bergmann Gabor
     */
    public static class TypeConstraintUtil {
        
        private TypeConstraintUtil() {
            // Hiding constructor for utility class
        }
        
        public static Map<Set<PVariable>, Set<PVariable>> getFunctionalDependencies(IQueryMetaContext context, IInputKey inputKey, Tuple variablesTuple) {
            final Map<Set<PVariable>, Set<PVariable>> result = new HashMap<Set<PVariable>, Set<PVariable>>();
            
            Set<Entry<Set<Integer>, Set<Integer>>> dependencies = context.getFunctionalDependencies(inputKey).entrySet();
            for (Entry<Set<Integer>, Set<Integer>> dependency : dependencies) {
                result.put(
                        transcribeVariables(dependency.getKey(), variablesTuple), 
                        transcribeVariables(dependency.getValue(), variablesTuple)
                );
            }

            return result;
        }

        private static Set<PVariable> transcribeVariables(Set<Integer> indices, Tuple variablesTuple) {
            Set<PVariable> result = new HashSet<PVariable>();
            for (Integer index : indices) {
                result.add((PVariable) variablesTuple.get(index));
            }
            return result;
        }

    }

}