private static void CreateOrUpdateAbstractNodeFromConcreteNode(
            ConcreteNode srcNode,
            Cluster cluster,
            ref int abstractNodeId,
            int level,
            Dictionary <Id <ConcreteNode>, AbstractNodeInfo> abstractNodes)
        {
            AbstractNodeInfo abstractNodeInfo;

            if (!abstractNodes.TryGetValue(srcNode.NodeId, out abstractNodeInfo))
            {
                cluster.AddEntrance(
                    Id <AbstractNode> .From(abstractNodeId),
                    new Position(srcNode.Info.Position.X - cluster.Origin.X, srcNode.Info.Position.Y - cluster.Origin.Y));

                abstractNodeInfo = new AbstractNodeInfo(
                    Id <AbstractNode> .From(abstractNodeId),
                    level,
                    cluster.Id,
                    new Position(srcNode.Info.Position.X, srcNode.Info.Position.Y),
                    srcNode.NodeId);
                abstractNodes[srcNode.NodeId] = abstractNodeInfo;

                abstractNodeId++;
            }
            else if (level > abstractNodeInfo.Level)
            {
                abstractNodeInfo.Level = level;
            }
        }