• [^] # Re: Lisibilité

    Posté par (site web personnel) . En réponse au journal Jouons avec le ``switch`` et C++17. Évalué à 8.

    C'est pour supporter l'argument axis de numpy.argmin ou numpy.argmax dans pythran. Le commit complet, à peu près autour de la bonne ligne, est là :

    https://github.com/serge-sans-paille/pythran/pull/803/files#diff-b20072554ff33a1cd786318f40ff0368R110
    (attention, réponse demandant un peu de connaissance de l'API numpy)

    Comme le paramètre d'entrée est une expression-tableau de dimension N (paramètre template), et qu'on veut calculer argmin en suivant l'axe axis (paramètre non connu à la compilation), il faut générer les N patrons de boucle possibles suivant la valeur de l'axe.

    Petit exemple pour N = 3, on peut vouloir générer (cas du min qui est un peu plus simple, mais c'est l'idée)

    // axis == 2
    for(int i = 0; i < n; i++)
     for(int j = 0; j < m; ++j)
     for(int k = 0; k < p; ++k)
     out[j, k] = min(out[j, k], in[i, j, k]);
    // axis == 1
    for(int i = 0; i < n; i++)
     for(int j = 0; j < m; ++j)
     for(int k = 0; k < p; ++k)
     out[i, k] = min(out[i, k], in[i, j, k]);
    // axis == 0
    for(int i = 0; i < n; i++)
     for(int j = 0; j < m; ++j)
     for(int k = 0; k < p; ++k)
     out[i, j] = min(out[i, j], in[i, j, k]);

    le code pointé plus haut génère ces différentes boucles quelque soit N, dans le cas de argmin, en gardant un typage correct.

    Je ne sais pas si je suis clair :-/