105 lines
3.4 KiB
PHP
105 lines
3.4 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\SimplePerceptron;
|
|
use App\Models\SimplePerceptronTraining;
|
|
use App\Services\DataSetReader;
|
|
use App\Services\ISynapticWeightsProvider;
|
|
use App\Services\PerceptronIterationEventBuffer;
|
|
use App\Services\ZeroSynapticWeights;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Log;
|
|
|
|
class PerceptronController extends Controller
|
|
{
|
|
/**
|
|
* Display the specified resource.
|
|
*/
|
|
public function index(Request $request)
|
|
{
|
|
$perceptronType = $request->query('type', 'simple');
|
|
|
|
$learningRate = 0.1;
|
|
$maxIterations = 100;
|
|
|
|
switch ($perceptronType) {
|
|
case 'simple':
|
|
$learningRate = 0.015;
|
|
$maxIterations = 100;
|
|
break;
|
|
}
|
|
|
|
return inertia('PerceptronViewer', [
|
|
'type' => $perceptronType,
|
|
'sessionId' => session()->getId(),
|
|
'datasets' => $this->getDatasets(),
|
|
'minError' => 0.01,
|
|
'learningRate' => $learningRate,
|
|
'maxIterations' => $maxIterations,
|
|
]);
|
|
}
|
|
|
|
private function getDatasets(): array
|
|
{
|
|
$dataSetsDirectory = public_path('data_sets');
|
|
$files = scandir($dataSetsDirectory);
|
|
$datasets = [];
|
|
foreach ($files as $file) {
|
|
if (pathinfo($file, PATHINFO_EXTENSION) === 'csv') {
|
|
$dataset = [];
|
|
$dataset['label'] = str_replace('.csv', '', $file);
|
|
$dataSetReader = new DataSetReader($dataSetsDirectory . '/' . $file);
|
|
$dataset['data'] = $dataSetReader->lines;
|
|
|
|
switch ($dataset['label']) {
|
|
case '2.9':
|
|
$dataset['defaultLearningRate'] = 0.015;
|
|
break;
|
|
}
|
|
$datasets[] = $dataset;
|
|
}
|
|
}
|
|
return $datasets;
|
|
}
|
|
|
|
private function getDataSetReader(string $dataSet): DataSetReader
|
|
{
|
|
$dataSetFileName = "data_sets/{$dataSet}.csv";
|
|
return new DataSetReader($dataSetFileName);
|
|
}
|
|
|
|
public function run(Request $request, ISynapticWeightsProvider $synapticWeightsProvider)
|
|
{
|
|
$perceptronType = $request->input('type', 'simple');
|
|
$minError = $request->input('min_error', 0.01);
|
|
$weightInitMethod = $request->input('weight_init_method', 'random');
|
|
$dataSet = $request->input('dataset');
|
|
$learningRate = $request->input('learning_rate', 0.015);
|
|
$maxIterations = $request->input('max_iterations', 100);
|
|
$sessionId = $request->input('session_id', session()->getId());
|
|
$trainingId = $request->input('training_id');
|
|
|
|
if ($weightInitMethod === 'zeros') {
|
|
$synapticWeightsProvider = new ZeroSynapticWeights();
|
|
}
|
|
|
|
$dataSetReader = $this->getDataSetReader($dataSet);
|
|
|
|
$iterationEventBuffer = new PerceptronIterationEventBuffer($sessionId, $trainingId);
|
|
|
|
$networkTraining = match ($perceptronType) {
|
|
'simple' => new SimplePerceptronTraining($dataSetReader, $learningRate, $maxIterations, $synapticWeightsProvider, $iterationEventBuffer, $sessionId, $trainingId),
|
|
default => null,
|
|
};
|
|
|
|
event(new \App\Events\PerceptronInitialization($dataSetReader->lines, $networkTraining->activationFunction, $sessionId, $trainingId));
|
|
|
|
$networkTraining->start();
|
|
|
|
return response()->json([
|
|
'message' => 'Training completed',
|
|
]);
|
|
}
|
|
}
|