public async Task <ContainerOutput> ReadLineAsync(MultiplexedStream multiplexedStream, CancellationToken cancellationToken) { List <byte> receiverStdOut = new List <byte>(); List <byte> receiverStdErr = new List <byte>(); byte[] buffer = new byte[15]; while (!cancellationToken.IsCancellationRequested) { var readResult = await multiplexedStream.ReadOutputAsync(buffer, 0, buffer.Length, cancellationToken); if (readResult.Target == MultiplexedStream.TargetStream.StandardError) { receiverStdErr.AddRange(buffer.Take(readResult.Count)); } if (readResult.Target != MultiplexedStream.TargetStream.StandardOut) { continue; } int newLineIndex = -1; for (int i = 0; i < readResult.Count; ++i) { if (buffer[i] == NewLineChar) { newLineIndex = i; break; } } if (newLineIndex != -1) { receiverStdOut.AddRange(buffer.Take(newLineIndex)); break; } receiverStdOut.AddRange(buffer.Take(readResult.Count)); } var result = new ContainerOutput(); try { result.StdErr = Encoding.ASCII.GetString(receiverStdErr.ToArray()); } catch (Exception ex) { this.logger.LogWarning(ex, "Ошибка при чтении stderr"); } result.StdOut = Encoding.ASCII.GetString(receiverStdOut.ToArray()); return(result); }
/// <summary> /// This overload takes a map that tells which parts can link to which /// </summary> public static ContainerOutput[] LinkNeurons(BotConstruction_PartMap partMap, ContainerInput[] containers, double maxWeight) { //TODO: Take these as params (these are used when hooking up existing links) const int MAXINTERMEDIATELINKS = 3; const int MAXFINALLINKS = 3; NeuralLink[][] internalLinks, externalLinks; if (containers.Any(o => o.ExternalLinks != null || o.InternalLinks != null)) { internalLinks = BuildInternalLinksExisting(containers, MAXINTERMEDIATELINKS, MAXFINALLINKS); externalLinks = BuildExternalLinksExisting(containers, MAXINTERMEDIATELINKS, MAXFINALLINKS); //NOTE: The partMap isn't needed for existing links. It is just to help figure out new random links internalLinks = CapWeights(internalLinks, maxWeight); externalLinks = CapWeights(externalLinks, maxWeight); } else { internalLinks = BuildInternalLinksRandom(containers, maxWeight); externalLinks = BuildExternalLinksRandom(partMap, containers, maxWeight); } // Build the return ContainerOutput[] retVal = new ContainerOutput[containers.Length]; for (int cntr = 0; cntr < containers.Length; cntr++) { retVal[cntr] = new ContainerOutput(containers[cntr].Container, internalLinks[cntr], externalLinks[cntr]); } // Exit Function return retVal; }