data === []) { return; } event(new PerceptronTrainingIteration($this->data, $this->sessionId, $this->trainingId)); $this->data = []; } public function addIteration(int $epoch, int $exampleIndex, float $error, array $synaptic_weights): void { $newData = [ 'epoch' => $epoch, 'exampleIndex' => $exampleIndex, 'error' => $error, 'weights' => $synaptic_weights, ]; if ($this->activeEpoch !== $epoch) { $this->flush(); $this->activeEpoch = $epoch; $this->shouldBroadcastEpoch = $epoch === 1 || $epoch % $this->epochInterval === 0; } if (! $this->shouldBroadcastEpoch) { return; } $this->data[] = $newData; if ($this->payloadExceedsLimit() || count($this->data) >= config('perceptron.broadcast_iteration_size')) { $this->flush(); } } private function payloadExceedsLimit(): bool { return strlen(json_encode([ 'iterations' => $this->data, 'trainingId' => $this->trainingId, ], JSON_THROW_ON_ERROR)) > config('broadcasting.broadcast_max_payload_size'); } }