public void Propose(Dictionary <MathIdentifier, IRouteDistance> vec, IConversionRouter proposedBy) { foreach (KeyValuePair <MathIdentifier, IRouteDistance> distance in vec) { Propose(distance.Value, proposedBy); } }
public CustomDataRef(Type instanceType, IConversionRouter router, ICustomData instance) { _instanceType = instanceType; _router = router; _typeId = router.TypeIdentifier; _instance = instance; }
public ConversionDistance(MathIdentifier canConvertFrom, int cost, bool lossless, IConversionRouter nextHop, Converter <object, object> convert) { _canConvertFrom = canConvertFrom; _cost = cost; _lossless = lossless; _nextHop = nextHop; _convert = convert; }
public void AddTargetNeighbor(IConversionRouter routerWeCanConvertTo) { if (!targetNeighbors.ContainsKey(routerWeCanConvertTo.TypeIdentifier)) { targetNeighbors.Add(routerWeCanConvertTo.TypeIdentifier, routerWeCanConvertTo); BroadcastDistanceVector(routerWeCanConvertTo); } }
public void AddTargetNeighbor(IConversionRouter routerWeCanConvertTo) { if(!targetNeighbors.ContainsKey(routerWeCanConvertTo.TypeIdentifier)) { targetNeighbors.Add(routerWeCanConvertTo.TypeIdentifier, routerWeCanConvertTo); BroadcastDistanceVector(routerWeCanConvertTo); } }
public void BroadcastDistanceVector(IConversionRouter target) { target.Propose(vector, this); }
/// <returns>True if the route was better than existing routes.</returns> /// <remarks>It is expected that we already know the proposing neighbor router <c>proposedBy</c>!</remarks> public bool Propose(IRouteDistance distance, IConversionRouter proposedBy) { MathIdentifier id = distance.CanConvertFrom; // I'm already myself, so I won't accept it whatever you propose :) if (structureId.Equals(id)) { return(false); } bool knownLosslessProposer = losslessNeighbors.ContainsKey(proposedBy.TypeIdentifier); bool knownLossyProposer = lossyNeighbors.ContainsKey(proposedBy.TypeIdentifier); // does the router propose himself? if (proposedBy.TypeIdentifier.Equals(id)) { if (distance.Cost != 0) { throw new InvalidOperationException("An conversion router strangely thinks he can't reach himself with zero cost."); } // we didn't know it, or it's better than before, so we add it to the neighbor list if (distance.Lossless && !knownLosslessProposer) { losslessNeighbors[id] = new ConversionRoute(id, distance.Convert); } else if (!distance.Lossless && !knownLossyProposer) { lossyNeighbors[id] = new ConversionRoute(id, distance.Convert); } else { return(false); } // we also want to add this neighbour to the vector. vector[id] = new ConversionDistance(id, 1, distance.Lossless, proposedBy, distance.Convert); // before we broadcast our vector, we wan't to "subscribe" on this new inbound router // to receive all his broadcasts. proposedBy.AddTargetNeighbor(this); // now we broadcast (probably we already did this when the router sent any // broadcasts as a result of AddTargetNeighbor, but we want to be sure) BroadcastDistanceVector(); return(true); } if (!(knownLosslessProposer || knownLossyProposer)) { throw new InvalidOperationException("An unknown router strangely proposes some other host without first proposing himself."); } // apparently he proposes some other host to be routed through himself, // so we have to combine the poposed cost with those required to reach himself bool lossless = distance.Lossless && knownLosslessProposer; int cost = distance.Cost + 1; // is the proposed route better, or didn't we even know such a route yet? IRouteDistance existingDistance; if (!vector.TryGetValue(id, out existingDistance) || lossless && !existingDistance.Lossless || cost < existingDistance.Cost && (lossless || !existingDistance.Lossless)) { // then we want to add this route to our vector // we have to map the proposed conversion with then one required to convert from him Converter <object, object> distanceC = distance.Convert, localC, convert; if (knownLosslessProposer) { localC = losslessNeighbors[proposedBy.TypeIdentifier].Convert; } else { localC = lossyNeighbors[proposedBy.TypeIdentifier].Convert; } convert = delegate(object v) { return(localC(distanceC(v))); }; // Add route to vector and broadcast the vector. vector[id] = new ConversionDistance(id, cost, lossless, proposedBy, convert); BroadcastDistanceVector(); return(true); } else { return(false); } }
public void AddSourceNeighbor(IConversionRouter routerWeCanConvertFrom, bool lossless, Converter <object, object> directConvert) { MathIdentifier id = routerWeCanConvertFrom.TypeIdentifier; Propose(new ConversionDistance(id, 0, lossless, null, directConvert), routerWeCanConvertFrom); }
public void AddSourceNeighbor(IConversionRouter routerWeCanConvertFrom, bool lossless, Converter<object, object> directConvert) { MathIdentifier id = routerWeCanConvertFrom.TypeIdentifier; Propose(new ConversionDistance(id, 0, lossless, null, directConvert), routerWeCanConvertFrom); }
public ConversionDistance(MathIdentifier canConvertFrom, int cost, bool lossless, IConversionRouter nextHop, Converter<object, object> convert) { _canConvertFrom = canConvertFrom; _cost = cost; _lossless = lossless; _nextHop = nextHop; _convert = convert; }
public void Propose(Dictionary<MathIdentifier, IRouteDistance> vec, IConversionRouter proposedBy) { foreach(KeyValuePair<MathIdentifier, IRouteDistance> distance in vec) Propose(distance.Value, proposedBy); }
/// <returns>True if the route was better than existing routes.</returns> /// <remarks>It is expected that we already know the proposing neighbor router <c>proposedBy</c>!</remarks> public bool Propose(IRouteDistance distance, IConversionRouter proposedBy) { MathIdentifier id = distance.CanConvertFrom; // I'm already myself, so I won't accept it whatever you propose :) if(structureId.Equals(id)) return false; bool knownLosslessProposer = losslessNeighbors.ContainsKey(proposedBy.TypeIdentifier); bool knownLossyProposer = lossyNeighbors.ContainsKey(proposedBy.TypeIdentifier); // does the router propose himself? if(proposedBy.TypeIdentifier.Equals(id)) { if(distance.Cost != 0) throw new InvalidOperationException("An conversion router strangely thinks he can't reach himself with zero cost."); // we didn't know it, or it's better than before, so we add it to the neighbor list if(distance.Lossless && !knownLosslessProposer) losslessNeighbors[id] = new ConversionRoute(id, distance.Convert); else if(!distance.Lossless && !knownLossyProposer) lossyNeighbors[id] = new ConversionRoute(id, distance.Convert); else return false; // we also want to add this neighbour to the vector. vector[id] = new ConversionDistance(id, 1, distance.Lossless, proposedBy, distance.Convert); // before we broadcast our vector, we wan't to "subscribe" on this new inbound router // to receive all his broadcasts. proposedBy.AddTargetNeighbor(this); // now we broadcast (probably we already did this when the router sent any // broadcasts as a result of AddTargetNeighbor, but we want to be sure) BroadcastDistanceVector(); return true; } if(!(knownLosslessProposer || knownLossyProposer)) throw new InvalidOperationException("An unknown router strangely proposes some other host without first proposing himself."); // apparently he proposes some other host to be routed through himself, // so we have to combine the poposed cost with those required to reach himself bool lossless = distance.Lossless && knownLosslessProposer; int cost = distance.Cost + 1; // is the proposed route better, or didn't we even know such a route yet? IRouteDistance existingDistance; if(!vector.TryGetValue(id, out existingDistance) || lossless && !existingDistance.Lossless || cost < existingDistance.Cost && (lossless || !existingDistance.Lossless)) { // then we want to add this route to our vector // we have to map the proposed conversion with then one required to convert from him Converter<object, object> distanceC = distance.Convert, localC, convert; if(knownLosslessProposer) localC = losslessNeighbors[proposedBy.TypeIdentifier].Convert; else localC = lossyNeighbors[proposedBy.TypeIdentifier].Convert; convert = delegate(object v) { return localC(distanceC(v)); }; // Add route to vector and broadcast the vector. vector[id] = new ConversionDistance(id, cost, lossless, proposedBy, convert); BroadcastDistanceVector(); return true; } else return false; }
public static void AddConverterTo(IConversionRouter destinationRouter, bool lossless, Converter <object, object> directConvert) { destinationRouter.AddSourceNeighbor(_router, lossless, directConvert); }
public static void AddConverterFrom(IConversionRouter sourceRouter, bool lossless, Converter <object, object> directConvert) { _router.AddSourceNeighbor(sourceRouter, lossless, directConvert); }