Publié le :
Macro CREATION_INTERNE

Tests unitaires pour la fonction de clustering spectral 'spccSpectralize'

Le script définit et exécute deux macros de test pour une routine de clustering spectral. Chaque macro utilise PROC IML pour simuler et vérifier des parties du processus de spectralisation. La première macro (`spccSpectralize1`) teste la spectralisation avec un voisinage de type 'knn' et une normalisation 'normalizedRW'. La seconde (`spccSpectralize2`) teste avec un voisinage 'mutual_knn' et une normalisation 'normalizedSym'. Des fonctions IML internes sont redéfinies (stubbing/mocking) pour intercepter les appels et valider les paramètres passés. Le résultat final est comparé à une valeur attendue pour déterminer le succès ou l'échec du test, stocké dans la variable macro 'return_code'. Un framework de test externe, appelé via la macro `%test()`, est utilisé pour exécuter ces tests.
Analyse des données

Type : CREATION_INTERNE


Les données sont créées directement dans le code via une matrice IML (`m = {0 1, 0 2, 0 3, 0 4};`). Aucune source de données externe n'est utilisée.

1 Bloc de code
PROC IML
Explication :
Ce bloc définit et exécute la macro de test `spccSpectralize1`. La macro utilise `PROC IML` pour valider la fonction `spccSpectralize` avec les options `normalizedRW` et `knn`. Des fonctions IML (`spccGaussNeigh`, `spccKNNNeigh`, `spccEigenLRW`) sont redéfinies pour simuler leur comportement et vérifier les arguments qui leur sont passés. Un code de retour (`return_code`) est généré pour indiquer le succès du test. La macro `%test()` lance l'exécution.
Copié !
1%macro spccSpectralize1;
2 %let gauss_correct = 0;
3 %let knn_correct = 0;
4 %let l_correct = 0;
5 PROC IML;
6
7 package load spectralclust;
8 start spccGaussNeigh(m, sigma);
9 expected = {0 1, 0 2, 0 3, 0 4};
10 IF sigma = 0.5 & m = expected THEN DO;
11 call symput('gauss_correct', '1');
12 END;
13 ret = {0 3 2 1, 3 0 3 2, 2 3 0 3, 1 2 3 0};
14 return ret;
15 finish;
16
17 start spccKNNNeigh(m, k);
18 expected = {0 3 2 1, 3 0 3 2, 2 3 0 3, 1 2 3 0};
19 IF k = 2 & m = expected THEN DO;
20 call symput('knn_correct', '1');
21 END;
22 ret = {0 3 2 0, 3 0 3 2, 2 3 0 3, 0 2 3 0};
23 return ret;
24 finish;
25
26 start spccEigenLRW(m, nvecs);
27 expected = {0 3 2 0, 3 0 3 2, 2 3 0 3, 0 2 3 0};
28 IF nvecs = 2 & m = expected THEN DO;
29 call symput('l_correct', '1');
30 END;
31 ret = {1 1 1, -2.1638 0.2889 1, 2.1639 -0.2888 1, -1 -1 1};
32 return ret;
33 finish;
34
35 m = {0 1, 0 2, 0 3, 0 4};
36 expected = {1 1 1, -2.1638 0.2889 1, 2.1639 -0.2888 1, -1 -1 1};
37 out = spccSpectralize(m, 2, 'normalizedRW', 'gaussian', 0.5, 'knn', 2);
38 correct = all(out = expected);
39 IF &l_correct & &gauss_correct & &knn_correct & correct THEN call symput('return_code', '0');
40 ELSE call symput('return_code', '1');
41 QUIT;
42%mend;
43 
44%test(spccSpectralize1);
2 Bloc de code
PROC IML
Explication :
Ce second bloc définit et exécute la macro de test `spccSpectralize2`. Il suit la même logique que le premier mais valide la fonction `spccSpectralize` avec un jeu de paramètres différent : la normalisation `normalizedSym` et le voisinage `mutual_knn`. Il s'assure que l'algorithme se comporte correctement avec cette configuration alternative en redéfinissant les fonctions `spccMutKNNNeigh` et `spccEigenLSym`. La macro `%test()` lance l'exécution.
Copié !
1%macro spccSpectralize2;
2 %let gauss_correct = 0;
3 %let knn_correct = 0;
4 %let l_correct = 0;
5 PROC IML;
6
7 package load spectralclust;
8 start spccGaussNeigh(m, sigma);
9 expected = {0 1, 0 2, 0 3, 0 4};
10 IF sigma = 0.5 & m = expected THEN DO;
11 call symput('gauss_correct', '1');
12 END;
13 ret = {0 3 2 1, 3 0 3 2, 2 3 0 3, 1 2 3 0};
14 return ret;
15 finish;
16
17 start spccMutKNNNeigh(m, k);
18 expected = {0 3 2 1, 3 0 3 2, 2 3 0 3, 1 2 3 0};
19 IF k = 2 & m = expected THEN DO;
20 call symput('knn_correct', '1');
21 END;
22 ret = {0 3 2 0, 3 0 3 2, 2 3 0 3, 0 2 3 0};
23 return ret;
24 finish;
25
26 start spccEigenLSym(m, nvecs);
27 expected = {0 3 2 0, 3 0 3 2, 2 3 0 3, 0 2 3 0};
28 IF nvecs = 2 & m = expected THEN DO;
29 call symput('l_correct', '1');
30 END;
31 ret = {1 1 1, -2.1638 0.2889 1, 2.1639 -0.2888 1, -1 -1 1};
32 return ret;
33 finish;
34
35 m = {0 1, 0 2, 0 3, 0 4};
36 expected = {1 1 1, -2.1638 0.2889 1, 2.1639 -0.2888 1, -1 -1 1};
37 out = spccSpectralize(m, 2, 'normalizedSym', 'gaussian', 0.5, 'mutual_knn', 2);
38 correct = all(out = expected);
39 IF &l_correct & &gauss_correct & &knn_correct & correct THEN call symput('return_code', '0');
40 ELSE call symput('return_code', '1');
41 QUIT;
42%mend;
43 
44%test(spccSpectralize2);
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.