Compare commits

...

9 Commits

Author SHA1 Message Date
Ninluc 6545d23e4f Revert "Fix reverb host"
linter / quality (push) Has been cancelled
tests / ci (8.3) (push) Has been cancelled
This reverts commit 24b2d29a41.
2026-10-04 17:07:20 +02:00
Ninluc 24b2d29a41 Fix reverb host
linter / quality (push) Has been cancelled
tests / ci (8.3) (push) Has been cancelled
2026-10-04 17:05:06 +02:00
Ninluc 151de1dcb8 Responsive
linter / quality (push) Successful in 4m3s
tests / ci (8.3) (push) Successful in 3m55s
2026-09-23 20:24:32 +02:00
Ninluc d3f914ba9a Footer links 2026-09-23 20:03:55 +02:00
Ninluc 5f4f751406 Fix spelling
linter / quality (push) Successful in 3m54s
tests / ci (8.3) (push) Successful in 3m31s
2026-09-22 10:26:34 +02:00
Ninluc d5409b11b7 Ajusted default error
linter / quality (push) Successful in 4m17s
tests / ci (8.3) (push) Successful in 3m36s
2026-09-22 10:13:37 +02:00
Ninluc 7cb528406c Optimize docker build
linter / quality (push) Successful in 3m58s
tests / ci (8.3) (push) Successful in 3m25s
2026-09-21 12:17:05 +02:00
Ninluc e10b2f8d1f Revert "Multi architecture build"
linter / quality (push) Successful in 8m47s
tests / ci (8.3) (push) Successful in 7m11s
This reverts commit 3efc323d28.
2026-09-21 11:40:02 +02:00
Ninluc 646e4841bb Better lint workflow 2026-09-21 09:49:47 +02:00
10 changed files with 86 additions and 15 deletions
+1 -6
View File
@@ -25,10 +25,6 @@ jobs:
id: get_version
run: echo "version=$(cat VERSION)" >> $GITHUB_OUTPUT
# Required for cross-compiling ARM64 images on x86_64 runners
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
@@ -39,12 +35,11 @@ jobs:
username: ninluc
password: ${{ secrets.REGISTRY_TOKEN }}
- name: Build and push multi-arch image
- name: Build and push
uses: docker/build-push-action@v6
with:
context: .
file: Dockerfile
platforms: linux/amd64,linux/arm64
push: true
cache-from: type=gha
cache-to: type=gha,mode=max
+3
View File
@@ -52,6 +52,9 @@ jobs:
with:
php-version: '8.4'
coverage: none
tools: composer:v2
env:
phpexts: none
- name: Setup Node
uses: actions/setup-node@v4
+10 -1
View File
@@ -150,7 +150,6 @@ class PerceptronController extends Controller
}
break;
case 'Classification_-_Oblique_(linéairement_séparable)':
case 'Classification_-_Oblique_modifié_(non_linéairement_séparable)':
switch ($perceptronType) {
case 'simple':
$dataset['defaultLearningRate'] = 0.015;
@@ -163,6 +162,16 @@ class PerceptronController extends Controller
break;
}
break;
case 'Classification_-_Oblique_modifié_(non_linéairement_séparable)':
switch ($perceptronType) {
case 'gradientdescent':
case 'adaline':
$dataset['defaultLearningRate'] = 0.001;
$dataset['defaultMinError'] = 0.3;
$dataset['defaultMaxIterations'] = 2000;
break;
}
break;
case 'Régression_-_Oblique':
$dataset['defaultMinError'] = 0.02;
switch ($perceptronType) {
+1 -1
View File
@@ -4,7 +4,7 @@ Cet outil vous permet d'expérimenter avec les réseaux de neurones et les perce
## Contexte
Ce projet a été d'abord créé pour un cours de réseaux de neurones artificiels que j'ai suivi durant mon master en Architecture des Systèmes Informatiques à la Haute École de la Province de Liège. Il s'agit ici d'une version plus conviviale, documentée et optimisée. Cependant le projet n'est pas très mobile friendly et je conseille l'utilisation d'un écran horizontal. 📵
Ce projet a été d'abord créé pour un cours de réseaux de neurones artificiels que j'ai suivi durant mon master en Architecture des Systèmes Informatiques à la Haute École de la Province de Liège. Il s'agit ici d'une version plus conviviale, documentée et optimisée.
Je conseille de finir de lire les prochains chapitres qui traitent des bases des réseaux de neurones et qui présentent l'interface. Je conseille ensuite d'utiliser les onglets au-dessus de la page dans l'ordre indiqué. Chaque onglet présente une évolution des réseaux de neurones dans l'ordre chronologique des découvertes et des améliorations faites.
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

@@ -332,7 +332,7 @@ function getPerceptronDecisionBoundaryDataset(
<template>
<Chart
v-if="props.cleanedDataset.length > 0 || props.iterations.length > 0"
class="flex bg-primary dark:bg-transparent!"
class="w-full flex bg-primary dark:bg-transparent!"
type="scatter"
:options="{
responsive: true,
@@ -92,7 +92,7 @@ const datasets = computed<ErrorDataset[]>(() => {
<template>
<Chart
type="bar"
class="bg-primary dark:bg-transparent!"
class="w-full bg-primary dark:bg-transparent!"
:options="{
responsive: true,
maintainAspectRatio: true,
@@ -100,8 +100,8 @@ const datasets = computed<ErrorDataset[]>(() => {
title: {
display: true,
text: props.isRegression
? 'Erreur de prédiction par epoch'
: 'Nombre d\'erreurs par epoch',
? 'Erreur de prédiction par époque'
: 'Nombre d\'erreurs par époque',
},
},
animation: {
+64
View File
@@ -1,17 +1,81 @@
<script lang="ts" setup>
import { Head } from '@inertiajs/vue3';
import { onMounted, ref } from 'vue';
import HelpText from '@/components/HelpText.vue';
import LinkHeader from '@/components/LinkHeader.vue';
const icons = {
'matthiasgdev.png': {
href: 'https://abcd.matthiasg.dev/q/portfolio',
alt: 'Portfolio',
},
'gitea.png': {
href: 'https://git.matthiasg.dev/Ninluc/perceptron-viewer',
alt: 'Dépôt Git',
},
};
const iconsFolder: string = '/img/footerIcons/';
const iconHtml = ref<Record<string, string>>({});
onMounted(async () => {
try {
const svgEntries = await Promise.all(
Object.keys(icons)
.filter((icon) => icon.endsWith('.svg'))
.map(async (icon) => {
const response = await fetch(`${iconsFolder}${icon}`);
if (!response.ok) {
throw new Error(`Failed to load ${icon}`);
}
return [icon, await response.text()] as const;
}),
);
iconHtml.value = Object.fromEntries(svgEntries);
} catch (error) {
console.error('Could not load footer icons:', error);
}
});
</script>
<template>
<Head title="Perceptron Viewer"></Head>
<main class="flex min-h-dvh flex-col gap-6 pb-6">
<LinkHeader class="w-full my-0! py-6 sticky top-0 z-10 bg-background" />
<div
class="flex flex-col items-center gap-6 rounded-lg p-6 shadow sm:p-8"
>
<HelpText markdownFileName="intro" class="max-w-[90ch]" />
</div>
<hr />
<footer class="p-10 flex flex-col gap-6">
<p class="text-center text-muted-foreground">
Autres liens :
</p>
<div class="flex flex-wrap justify-center align-center gap-10">
<a
v-for="(iconData, icon) in icons"
:key="icon"
:href="iconData.href"
:aria-label="iconData.alt"
target="_blank"
rel="noopener noreferrer"
class="min-h-full flex flex-col justify-between items-center gap-2 transition hover:scale-110"
>
<img
:src="iconsFolder + icon"
:alt="iconData.alt"
class="contain-size w-20 transition brightness-200 hover:brightness-100 hover:saturate-100 hover:opacity-70"
/>
<p>{{ iconData.alt }}</p>
</a>
</div>
</footer>
</main>
</template>
+3 -3
View File
@@ -256,10 +256,10 @@ watch([iterations, trainingEnded], async () => {
@update:training-id="setTrainingId"
/>
<div
class="align-items-start justify-content-center grid max-w-dvw grid-cols-2"
class="align-items-start justify-content-center grid min-w-0 max-w-dvw grid-cols-1 md:grid-cols-[repeat(auto-fit,minmax(36rem,1fr))]"
v-if="selectedDatasetName || iterations.length > 0"
>
<div class="pt-3 h-dvh max-h-dvh min-h-0 w-full min-w-0">
<div class="order-2 pt-3 xl:h-dvh h-[50dvh] max-h-dvh min-h-0 w-full min-w-0 xl:order-0">
<ScrollArea ref="iterationScrollArea" :keep-bottom="true" type="scroll" class="relative h-full max-h-full min-h-0 w-full">
<IterationTable
:iterations="iterations"
@@ -305,7 +305,7 @@ watch([iterations, trainingEnded], async () => {
</template>
</ScrollArea>
</div>
<div class="h-full w-full min-w-0 space-y-6">
<div class="order-1 h-full w-full min-w-0 space-y-6 md:order-0">
<div>
<PerceptronDecisionGraph
:cleanedDataset="cleanedDataset"