Newer
Older
AlgebraicDataflowArchitectureModel / AlgebraicDataflowArchitectureModel / src / algorithm / UpdateConflictCheck.java
yoichiro on 22 Mar 2020 2 KB 整合性判定の実装完了?
package algorithm;

import java.util.*;

import models.*;
import models.dataConstraintModel.ChannelGenerator;
import models.dataConstraintModel.ChannelMember;
import models.dataConstraintModel.IdentifierTemplate;
import models.dataFlowModel.DataFlowModel;
import models.dataFlowModel.DataflowChannelGenerator;

public class UpdateConflictCheck {
	private int index = 0;
	private Deque<Node> stack = new ArrayDeque<>();
	private Set<Set<Node>> strong = new HashSet<>();
	private Map<Node, Integer> ids = new HashMap<>();
	private Map<Node, Integer> lowlink = new HashMap<>();
	private Map<Node, Boolean> onStack = new HashMap<>();

	private void init() {
		index = 0;
		stack = new ArrayDeque<>();
		strong = new HashSet<>();
		ids = new HashMap<>();
		lowlink = new HashMap<>();
		onStack = new HashMap<>();
	}

	private void strongconnect(Node node) {
		ids.put(node, index);
		lowlink.put(node, index);
		index++;
		stack.push(node);
		onStack.put(node, true);

		for (Node n : node.getSuccessors()) {
			if (lowlink.containsKey(n)) {
				strongconnect(n);
				if (lowlink.get(node) > lowlink.get(n)) {
					lowlink.replace(node, lowlink.get(n));
				}
			} else if (onStack.get(n)) {
				if (lowlink.get(node) > lowlink.get(n)) {
					lowlink.replace(node, lowlink.get(n));
				}
			}
		}
		if (lowlink.get(node) == ids.get(node)) {
			Set<Node> tmp = new HashSet<>();
			Node w;
			do {
				w = stack.pop();
				onStack.replace(node, false);
				tmp.add(w);
			} while (node != w);
			strong.add(tmp);
		}
	}

	public boolean run(DataFlowModel model) {
		init();
		boolean check = true;
		for (Node node : model.getResourceDependencyGraph().getNodes()) {
			if (ids.containsKey(node)) {
				strongconnect(node);
			}
		}
		System.out.println(strong.size() + " " +model.getResourceDependencyGraph().getNodes().size());
		for(ChannelGenerator cg:model.getChannelGenerators()) {
			DataflowChannelGenerator data = (DataflowChannelGenerator)cg;
			for(ChannelMember channel:data.getChannelMembers()) {
				for(ChannelMember another:data.getChannelMembers()) {
					if(!channel.equals(another)) {
						check = channel.getIdentifierTemplate() != another.getIdentifierTemplate();
					}
				}
			}
		}
		return strong.size() == 0 && check;
	}
}