AMC + Pythontex : fichier DOC-SUJET et DOC-INDIV-SOLUTIONS sont incompatibles

Added by Nizar MOUSSATAT about 1 year ago

Bonjour

Après la compilation finale, ces fichiers sont différents. Lorsque les questions sont ouvertes, cela n'a pas d'importance, mais dans mon cas j'ai crée des questions ou les bonnes réponses sont générées par pythontex.
Seul le sujet numéro 1 est conforme.
Les suivants ont choisi un tirage aléatoire différent.
La présence de random.seed dans le code ne change rien.

Ceci empêche la correction automatique de questions programmées. Avez-vous une solution à ce problème ?

Je joins le dossier test, et les fichier doc.


Replies (10)

RE: AMC + Pythontex : fichier DOC-SUJET et DOC-INDIV-SOLUTIONS sont incompatibles - Added by Frédéric Bréal about 1 year ago

%%AMC:preprocess_command=/chemin/vers/fichier/prePythonTex4AMC

Le chemin absolu est nécessaire, il me semble et pas relatif.

RE: AMC + Pythontex : fichier DOC-SUJET et DOC-INDIV-SOLUTIONS sont incompatibles - Added by Frédéric Bréal about 1 year ago

ma réponse n'est pas adapté car ici le ./prePythonTex4AMC fonctionne

RE: AMC + Pythontex : fichier DOC-SUJET et DOC-INDIV-SOLUTIONS sont incompatibles - Added by Stefan DEGROOTE about 1 year ago

Bonjour,

vos sujets sont différents à cause de la fonction "choices" qui ne semble pas réagir exactement de la même façon entre la compilation du sujet et celle du corrigé. J'ai déjà été confronté au problème il y a quelques années déjà. Pour info, la commande python shuffle, elle-aussi, pose problème comme d'autres j'imagine sans que je comprenne pourquoi.

J'ai résolu le problème en me créant des fonctions personnelles qui ont le même rôle.
Par exemple,
dans la partie pycode, j'importe numpy avec : import numpy as np
j'importe random avec : from random import*

Ensuite, si je veux par exemple mélanger une liste, j'utilise la fonction python np.random.randint(a,b) qui tire au hasard un entier entre a inclus et b exclu. Cette fonction, elle, a le même comportement entre les compilations du sujet et de la correction. Toutes les fonctions que j'ai créées utilise cette instruction np.random.randint(a,b)

Cela a résolu le souci que j'avais et que vous avez aussi.

Essayez de voir cette solution directement dans votre code car il est un peu trop morcelé entre plusieurs fichiers pour que je puisse faire un test.
N'hésitez pas à me contacter si besoin, j'ai plein de sujets AMC-PythonTeX pour les maths au lycée.

Bonne soirée.
Stefan

RE: AMC + Pythontex : fichier DOC-SUJET et DOC-INDIV-SOLUTIONS sont incompatibles - Added by Stefan DEGROOTE about 1 year ago

Pour compléter, un exemple d'une fonction qui mélange une liste :

def melangeliste(L):
rep = []
while len(L) > 0:
position = np.random.randint(0,len(L))
rep.append(L[position])
L.pop(position)
return rep

RE: AMC + Pythontex : fichier DOC-SUJET et DOC-INDIV-SOLUTIONS sont incompatibles - Added by Nizar MOUSSATAT about 1 year ago

Super d'avoir partagé cette indication. J'ai regardé le module numpy, et il a un choice propre à lui. En mettant dans le pycode :

rng = numpy.random.default_rng(12345)

Puis dans les codes de l'exercices :

rng.choice(['<','>','<=','>='])

et au lieu de choices:

rng.choice(['<','<='],size=2)

cela donne des fichiers corrects. C'est compatible AMC.

DOC-indiv-solution.pdf (220.7 kB)

DOC-sujet.pdf (220.6 kB)

RE: AMC + Pythontex : fichier DOC-SUJET et DOC-INDIV-SOLUTIONS sont incompatibles - Added by Alexis Bienvenüe about 1 year ago

vos sujets sont différents à cause de la fonction "choices" qui ne semble pas réagir exactement de la même façon entre la compilation du sujet et celle du corrigé.

C'est exactement ça : pour fonctionner, AMC compile à plusieurs reprise votre sujet et il est absolument nécessaire qu'à chaque fois cela donne le même résultat.
Or les fonctions python de random donnent des valeurs différentes à chaque exécution…
Pour éviter ce problème, vous pouvez fixer la graine du générateur aléatoire utilisé par python, avant toute utilisation d'une fonction de random, grâce à la commande

random.seed(12345)

Si vous changez la valeur en argument, vous obtiendrez un sujet différent, mais si vous compilez le sujets plusieurs fois avec la même valeur de cette graine, vous obtiendrez toujours le même sujet.
Il me semble que la fonction melangeliste proposée plus haut a le même comportement, sauf, encore une fois, si on prend soin de fixer la graine utilisée par numpy (attention : numpy.random a l'air d'utiliser un autre générateur que random) avec

np.random.seed(12345)

RE: AMC + Pythontex : fichier DOC-SUJET et DOC-INDIV-SOLUTIONS sont incompatibles - Added by Stefan DEGROOTE about 1 year ago

Bonjour,

pour compléter mon message précédent, je fixe toujours une graine du style np.random.seed(12345) dans mon code Python. Malgré cela, le comportement de fonctions telles que choice ou shuffle reste aléatoire et ne donne pas de sujets identiques malgré la graine ... alors que des codes comme ma fonction melangeliste, elle, fonctionne et donne toujours le même résultat suite aux différentes compilations.

Je ne sais vraiment pas pourquoi ... mais en ayant trouvé la "parade", je ne cherche pas plus loin.

Pour info, je génére mes sujets à partir d'un fichier csv ... peut-être en est-ce une des raisons.

Bonne journée et bonnes fêtes de fin d'année.
Stefan

RE: AMC + Pythontex : fichier DOC-SUJET et DOC-INDIV-SOLUTIONS sont incompatibles - Added by Alexis Bienvenüe about 1 year ago

Malgré cela, le comportement de fonctions telles que choice ou shuffle reste aléatoire

C'est bizarre. Pouvez-vous donner un exemple complet minimal de ce comportement ?
Utilisez-vous random.choice ou bien np.random.choice ? random.seed ou bien np.random.seed ? Les deux modules n'ont pas le même générateur aléatoire.

RE: AMC + Pythontex : fichier DOC-SUJET et DOC-INDIV-SOLUTIONS sont incompatibles - Added by Stefan DEGROOTE about 1 year ago

Bonjour Alexis,

je viens de faire quelques tests dans un projet. En effet, il y a une sacrée différence entre les deux instructions choice et np.random.choice.

Je choisis une graine avec np.random.seed(...)
Si je choisis juste choice, les sujets et corrections sont différentes ;
Si je choisis np.random.choice, les sujets et corrections sont bien identiques.

Je ne pensais pas, vu le nom identique de ces deux fonctions, qu'elles étaient différentes dans leurs fonctionnement. Cela explique pourquoi j'ai pu résoudre ce problème avec l'instruction np.random.randint(...) qui semble agir comme np.random.choice(...)

Il n'est jamais trop tard pour apprendre un truc. Ça simplifiera mes prochains projets.

Merci pour l'explication et le support toujours pertinent.
Bonne fêtes de fin d'année.

Stefan

(1-10/10)