Changeset 11530 for branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Core.Networks/MessagePort.cs
- Timestamp:
- 11/10/14 04:24:04 (9 years ago)
- File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Core.Networks/MessagePort.cs
r11529 r11530 23 23 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 24 24 using System; 25 using System.Collections.Generic; 25 26 using System.Drawing; 26 27 using System.Linq; … … 29 30 30 31 namespace HeuristicLab.Core.Networks { 31 [Item(" GenericPort", "A generic port of an optimization network node.")]32 [Item("MessagePort", "A port of a network node for sending and receiving messages.")] 32 33 [StorableClass] 33 public class GenericPort : ParameterizedPort, IGenericPort, IConnectedPort {34 public class MessagePort : ParameterizedPort, IMessagePort { 34 35 public override Image ItemImage { 35 36 get { … … 44 45 45 46 [Storable] 46 protected I ConnectedPort connectedPort;47 public I ConnectedPort ConnectedPort {47 protected IMessagePort connectedPort; 48 public IMessagePort ConnectedPort { 48 49 get { return connectedPort; } 49 50 set { … … 87 88 88 89 [StorableConstructor] 89 protected GenericPort(bool deserializing) : base(deserializing) { }90 protected GenericPort(GenericPort original, Cloner cloner)90 protected MessagePort(bool deserializing) : base(deserializing) { } 91 protected MessagePort(MessagePort original, Cloner cloner) 91 92 : base(original, cloner) { 92 93 connectedPort = cloner.Clone(original.connectedPort); … … 96 97 RegisterConnectedPortEvents(); 97 98 } 98 public GenericPort()99 : base(" GenericPort") {99 public MessagePort() 100 : base("MessagePort") { 100 101 portConnectionValid = true; 101 102 logMessages = false; 102 103 messages = new MessageCollection(); 103 104 } 104 public GenericPort(string name)105 public MessagePort(string name) 105 106 : base(name) { 106 107 portConnectionValid = true; … … 108 109 messages = new MessageCollection(); 109 110 } 110 public GenericPort(string name, string description)111 public MessagePort(string name, string description) 111 112 : base(name, description) { 112 113 portConnectionValid = true; … … 121 122 122 123 public override IDeepCloneable Clone(Cloner cloner) { 123 return new GenericPort(this, cloner);124 return new MessagePort(this, cloner); 124 125 } 125 126 … … 127 128 if (port == null) return true; 128 129 129 var cp = port as IConnectedPort; 130 if (cp == null) return false; 131 132 // check connected port input parameters 133 foreach (var input in cp.Parameters.Where(p => p.Type.HasFlag(PortParameterType.Input))) { 134 IPortParameter param; 135 Parameters.TryGetValue(input.Name, out param); 136 if ((param == null) && (input.DefaultValue == null)) return false; 137 if (!param.Type.HasFlag(PortParameterType.Output)) return false; 138 if (!input.DataType.IsAssignableFrom(param.DataType)) return false; 139 } 140 // check local port input parameters 141 foreach (var input in Parameters.Where(p => p.Type.HasFlag(PortParameterType.Input))) { 142 IPortParameter param; 143 cp.Parameters.TryGetValue(input.Name, out param); 144 if ((param == null) && (input.DefaultValue == null)) return false; 145 if (!param.Type.HasFlag(PortParameterType.Output)) return false; 146 if (!input.DataType.IsAssignableFrom(param.DataType)) return false; 147 } 130 var p = port as IMessagePort; 131 if (p == null) return false; 132 133 // check if the local parameters are compatible to the input parameters of the port 134 if (!ParametersCompatibleToTarget(Parameters, p.Parameters)) return false; 135 // check if the parameters of the port are compatible to the local input parameters 136 if (!ParametersCompatibleToTarget(p.Parameters, Parameters)) return false; 137 148 138 return true; 149 }150 public void CloneConnectedPortParameters() {151 Parameters.Clear();152 foreach (var p in connectedPort.Parameters) {153 var param = (IPortParameter)p.Clone();154 if (!(param.Type.HasFlag(PortParameterType.Input) && param.Type.HasFlag(PortParameterType.Output))) {155 param.Type = ~param.Type; // bitwise negation: input -> output, output -> input156 }157 Parameters.Add(param);158 }159 139 } 160 140 … … 163 143 var message = new Message(); 164 144 165 // collect output parameters from local port 166 message.Values.AddRange( 167 Parameters 168 .Where(p => p.Type.HasFlag(PortParameterType.Output)) 169 .Select(p => p.CreateMessageValue()) 170 ); 171 172 // collect remaining input parameters from connected port 145 // collect parameters from local port 146 message.Values.AddRange(Parameters.Select(p => p.CreateMessageValue())); 147 148 // collect remaining parameters from connected port 173 149 if (ConnectedPort != null) { 174 150 message.Values.AddRange( 175 151 ConnectedPort.Parameters 176 .Where(p => p.Type.HasFlag(PortParameterType.Input) &&!message.Values.ContainsKey(p.Name))152 .Where(p => !message.Values.ContainsKey(p.Name)) 177 153 .Select(p => p.CreateMessageValue()) 178 154 ); 179 155 } 180 181 // collect output parameters from connected port182 if (ConnectedPort != null) {183 message.Values.AddRange(184 ConnectedPort.Parameters185 .Where(p => p.Type.HasFlag(PortParameterType.Output) && !message.Values.ContainsKey(p.Name))186 .Select(p => p.CreateMessageValue())187 );188 }189 190 // collect remaining input parameters from local port191 message.Values.AddRange(192 Parameters193 .Where(p => p.Type.HasFlag(PortParameterType.Input) && !message.Values.ContainsKey(p.Name))194 .Select(p => p.CreateMessageValue())195 );196 156 197 157 return message; … … 270 230 } 271 231 #endregion 232 233 #region Helpers 234 protected virtual bool ParametersCompatibleToTarget(IEnumerable<IPortParameter> source, IEnumerable<IPortParameter> target) { 235 // checks if the source parameters are compatible to the input parameters of the target 236 foreach (var input in target.Where(p => p.Type.HasFlag(PortParameterType.Input))) { 237 var param = source.Where(p => input.Name == p.Name).FirstOrDefault(); 238 if (param == null) { 239 if (input.DefaultValue == null) return false; 240 } else { 241 if (!param.Type.HasFlag(PortParameterType.Output)) return false; 242 if (!input.DataType.IsAssignableFrom(param.DataType)) return false; 243 } 244 } 245 return true; 246 } 247 #endregion 272 248 } 273 249 }
Note: See TracChangeset
for help on using the changeset viewer.