public IEnumerable <IEnumerable <TUnit> > Clean(IEnumerable <IEnumerable <TUnitUnderTraining> > network) { var unitMapper = network.SelectMany(u => u).ToDictionary(u => u, CreateCleanUnit); var newNetwork = new List <IEnumerable <TUnit> >(); foreach (var layer in network) { var newLayer = new List <TUnit>(); layer.Enumerate(oldUnit => newLayer.Add(unitMapper[oldUnit])); newNetwork.Add(newLayer); } var oldConnections = unitMapper.SelectMany(u => u.Key.OutgoingConnections); oldConnections.Enumerate(c => { var thisNewUnit = unitMapper[c.InputUnit]; var otherNewUnit = unitMapper[c.OutputUnit]; var newConnection = TraversableConnection <IUnit, IConnection, IUnitActivation <IUnit> > .CreateConnection <Connection>(thisNewUnit, otherNewUnit); newConnection.Properties.Name = c.Properties.Name; newConnection.Properties.Weight = c.Properties.Weight; }); //Map network to multifolds unitMapper.Select(u => u.Value.UnitActivation).Where(ua => ua is TUnitActivationMultiFold).Cast <TUnitActivationMultiFold>().Enumerate(ua => ua.Network = newNetwork); return(newNetwork); }
private static void ConnectUnits(GenericNetworkBuilderState <TUnit, TConnection, TUnitActivation> state) { // Connect everything for (var i = 0; i < state.Network.Count - 1; i++) { var thisLayer = state.Network.ElementAt(i); var nextLayer = state.Network.ElementAt(i + 1); thisLayer.EnumerateCartesian(nextLayer, (l1, l2) => TraversableConnection <TUnit, TConnection, TUnitActivation> .CreateConnection <TConnectionImpl>(l1, l2)); } }
private ITraversableConnection <IUnitUnderTraining, IConnectionUnderTraining, IUnitActivationTraining> CreateConnection(ITraversableUnit <IUnitUnderTraining, IConnectionUnderTraining, IUnitActivationTraining> input, ITraversableUnit <IUnitUnderTraining, IConnectionUnderTraining, IUnitActivationTraining> output) { return(TraversableConnection <IUnitUnderTraining, IConnectionUnderTraining, IUnitActivationTraining> .CreateConnection <ConnectionUnderTraining>(input, output)); }