Click here to Skip to main content
15,892,809 members
Articles / Programming Languages / C#

Universal Framework for Science and Engineering - Part 2: Regression

Rate me:
Please Sign up or sign in to vote.
4.77/5 (19 votes)
11 Jul 20067 min read 51.2K   5K   76  
An article on universal scalable engineering framework applications.
using System;
using System.Collections;

using CategoryTheory;

namespace MathGraph
{
	/// <summary>
	/// Digraph
	/// </summary>
	public class Digraph
	{
		
		/// <summary>
		/// The "in not a path" string
		/// </summary>
		static public readonly string NotPath = "This diagram is not a path";
		
		/// <summary>
		/// Vertices
		/// </summary>
		protected ArrayList vertices = new ArrayList();


		/// <summary>
		/// Constructor
		/// </summary>
		public Digraph()
		{
		}

		/// <summary>
		/// Transforms digraph
		/// </summary>
		/// <param name="vertTransformer">Vertex transformer</param>
		/// <param name="edgeTransformer">Edge transformer</param>
		public void Transform(ObjectTransformer vertTransformer, ObjectTransformer edgeTransformer)
		{
			foreach (DigraphVertex v in vertices)
			{
				v.Object = vertTransformer(v.Object);
				foreach (DigraphEdge edge in v.OutcomingEdges)
				{
					edge.Object = edgeTransformer(edge.Object);
				}
			}
		}

		/// <summary>
		/// Adds vertex to this digraph
		/// </summary>
		/// <param name="vertex">Vertex to add</param>
		public void AddVertex(DigraphVertex vertex)
		{
			if (vertices.Contains(vertex))
			{
				throw new Exception("Vertex already exists");
			}
			vertices.Add(vertex);
		}
		
		/// <summary>
		/// Removes vertex from this digraph
		/// </summary>
		/// <param name="vertex">Vertex to remove</param>
		public void RemoveVertex(DigraphVertex vertex)
		{
			vertices.Remove(vertex);
			vertex.RemoveObject();
		}
		
		/// <summary>
		/// Resets indexes if vetices
		/// </summary>
		public void Reset()
		{
			foreach (DigraphVertex v in vertices)
			{
				v.Index = -1;
			}
		}

		/// <summary>
		/// Loops of digraph
		/// </summary>
		public ArrayList Loops
		{
			get
			{
				ArrayList list = new ArrayList();
				Reset();
				foreach (DigraphVertex v in vertices)
				{
					v.GetLoops(list);
					Reset();
				}
				return list;
			}
		}

		/// <summary>
		/// Count of vertices
		/// </summary>
		public int Count
		{
			get
			{
				return vertices.Count;
			}
		}

		/// <summary>
		/// Access to i th vertex
		/// </summary>
		public DigraphVertex this[int i]
		{
			get
			{
				return vertices[i] as DigraphVertex;
			}
		}

		/// <summary>
		/// Digraph path. Throws exception if digraph is not a path
		/// </summary>
		public DigraphEdge[] Path
		{
			get
			{
				ArrayList e = new ArrayList();
				ArrayList v = new ArrayList();
				DigraphVertex current = null;
				foreach (DigraphVertex vertex in vertices)
				{
					if (vertex.IncomingEdges.Count == 0)
					{
						current = vertex;
						break;
					}
				}
				if (current == null)
				{
					throw new Exception(NotPath);
				}
				v.Add(current);
				while (current.OutcomingEdges.Count > 0)
				{
					if (current.OutcomingEdges.Count > 1)
					{
						throw new Exception(NotPath);
					}
					DigraphEdge edge = current.OutcomingEdges[0] as DigraphEdge;
					current = edge.Target;
					if ((current.IncomingEdges.Count > 1) | v.Contains(current))
					{
						throw new Exception(NotPath);
					}
					v.Add(current);
					e.Add(edge);
				}
				foreach (DigraphVertex vertex in vertices)
				{
					if (!v.Contains(vertex))
					{
						throw new Exception(NotPath);
					}
				}
				DigraphEdge[] path = new DigraphEdge[e.Count];
				for (int i = 0; i < path.Length; i++)
				{
					path[i] = e[i] as DigraphEdge;
				}
				return path;
			}
		}
	}

}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Architect
Russian Federation Russian Federation
Ph. D. Petr Ivankov worked as scientific researcher at Russian Mission Control Centre since 1978 up to 2000. Now he is engaged by Aviation training simulators http://dinamika-avia.com/ . His additional interests are:

1) Noncommutative geometry

http://front.math.ucdavis.edu/author/P.Ivankov

2) Literary work (Russian only)

http://zhurnal.lib.ru/editors/3/3d_m/

3) Scientific articles
http://arxiv.org/find/all/1/au:+Ivankov_Petr/0/1/0/all/0/1

Comments and Discussions