QuizGenerator 0.10.0__tar.gz → 0.10.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/PKG-INFO +1 -1
  2. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/__init__.py +2 -1
  3. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/canvas/canvas_interface.py +3 -4
  4. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/canvas/classes.py +0 -1
  5. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/generate.py +7 -2
  6. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/logging.yaml +3 -3
  7. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/misc.py +0 -8
  8. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/premade_questions/cst334/memory_questions.py +2 -3
  9. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/premade_questions/cst334/process.py +0 -1
  10. quizgenerator-0.10.1/QuizGenerator/premade_questions/cst463/gradient_descent/__init__.py +12 -0
  11. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/premade_questions/cst463/gradient_descent/gradient_calculation.py +0 -1
  12. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/premade_questions/cst463/gradient_descent/gradient_descent_questions.py +2 -4
  13. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/premade_questions/cst463/gradient_descent/loss_calculations.py +1 -2
  14. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/premade_questions/cst463/gradient_descent/misc.py +1 -1
  15. quizgenerator-0.10.1/QuizGenerator/premade_questions/cst463/math_and_data/__init__.py +12 -0
  16. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/premade_questions/cst463/math_and_data/matrix_questions.py +0 -1
  17. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/premade_questions/cst463/math_and_data/vector_questions.py +0 -1
  18. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/premade_questions/cst463/models/attention.py +1 -4
  19. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/premade_questions/cst463/models/cnns.py +1 -4
  20. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/premade_questions/cst463/models/rnns.py +1 -4
  21. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/premade_questions/cst463/models/text.py +1 -4
  22. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/premade_questions/cst463/models/weight_counting.py +0 -2
  23. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/premade_questions/cst463/neural-network-basics/__init__.py +7 -0
  24. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/premade_questions/cst463/neural-network-basics/neural_network_questions.py +1 -9
  25. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/premade_questions/cst463/tensorflow-intro/__init__.py +7 -0
  26. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/premade_questions/cst463/tensorflow-intro/tensorflow_questions.py +0 -4
  27. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/qrcode_generator.py +0 -1
  28. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/question.py +0 -10
  29. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/quiz.py +1 -6
  30. quizgenerator-0.10.0/pyproject_prev.toml → quizgenerator-0.10.1/pyproject.toml +1 -1
  31. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/scripts/vendor_lms_interface.py +0 -1
  32. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/uv.lock +1 -1
  33. quizgenerator-0.10.0/QuizGenerator/premade_questions/cst463/gradient_descent/__init__.py +0 -3
  34. quizgenerator-0.10.0/QuizGenerator/premade_questions/cst463/math_and_data/__init__.py +0 -2
  35. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/.envrc +0 -0
  36. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/.github/pull_request_template.md +0 -0
  37. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/.github/workflows/release.yaml +0 -0
  38. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/.gitignore +0 -0
  39. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/AGENTS.md +0 -0
  40. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/CLAUDE.md +0 -0
  41. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/CODEOWNERS +0 -0
  42. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/LICENSE +0 -0
  43. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/README.md +0 -0
  44. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/__main__.py +0 -0
  45. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/canvas/__init__.py +0 -0
  46. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/constants.py +0 -0
  47. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/contentast.py +0 -0
  48. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/mixins.py +0 -0
  49. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/performance.py +0 -0
  50. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/premade_questions/__init__.py +0 -0
  51. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/premade_questions/basic.py +0 -0
  52. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/premade_questions/cst334/__init__.py +0 -0
  53. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/premade_questions/cst334/languages.py +0 -0
  54. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/premade_questions/cst334/math_questions.py +0 -0
  55. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/premade_questions/cst334/ostep13_vsfs.py +0 -0
  56. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/premade_questions/cst334/persistence_questions.py +0 -0
  57. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/premade_questions/cst463/__init__.py +0 -0
  58. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/premade_questions/cst463/models/__init__.py +0 -0
  59. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/premade_questions/cst463/models/matrices.py +0 -0
  60. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/regenerate.py +0 -0
  61. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/QuizGenerator/typst_utils.py +0 -0
  62. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/README.md +0 -0
  63. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/documentation/GRADING_GUIDE.md +0 -0
  64. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/documentation/PARAMETER_STANDARDS.md +0 -0
  65. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/documentation/README.md +0 -0
  66. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/documentation/WEB_UI_INTEGRATION.md +0 -0
  67. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/documentation/claude_todo.md +0 -0
  68. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/documentation/custom_questions.md +0 -0
  69. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/documentation/getting_started.md +0 -0
  70. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/documentation/quickstart.md +0 -0
  71. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/documentation/yaml_config_guide.md +0 -0
  72. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/example_files/cst334.yaml +0 -0
  73. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/example_files/cst463.yaml +0 -0
  74. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/example_files/example_exam.yaml +0 -0
  75. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/examples/README.md +0 -0
  76. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/examples/example_question.py +0 -0
  77. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/examples/web_ui_integration_example.py +0 -0
  78. /quizgenerator-0.10.0/pyproject.toml → /quizgenerator-0.10.1/pyproject_prev.toml +0 -0
  79. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/scripts/generate_practice_yaml.sh +0 -0
  80. {quizgenerator-0.10.0 → quizgenerator-0.10.1}/scripts/print.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: QuizGenerator
3
- Version: 0.10.0
3
+ Version: 0.10.1
4
4
  Summary: Generate randomized quiz questions for Canvas LMS and PDF exams
5
5
  Project-URL: Homepage, https://github.com/OtterDen-Lab/QuizGenerator
6
6
  Project-URL: Documentation, https://github.com/OtterDen-Lab/QuizGenerator/tree/main/documentation
@@ -5,6 +5,7 @@ import os
5
5
  import re
6
6
 
7
7
  def setup_logging() -> None:
8
+ os.makedirs(os.path.join("out", "logs"), exist_ok=True)
8
9
  config_path = os.path.join(os.path.dirname(__file__), 'logging.yaml')
9
10
  if os.path.exists(config_path):
10
11
  with open(config_path, 'r') as f:
@@ -24,4 +25,4 @@ def setup_logging() -> None:
24
25
  logging.basicConfig(level=logging.INFO)
25
26
 
26
27
  # Call this once when your application starts
27
- setup_logging()
28
+ setup_logging()
@@ -16,17 +16,16 @@ import canvasapi.submission
16
16
  import canvasapi.exceptions
17
17
  import dotenv, os
18
18
  import requests
19
- from canvasapi.util import combine_kwargs
20
19
 
21
20
  try:
22
- from urllib3.util.retry import Retry # urllib3 v2
21
+ pass # urllib3 v2
23
22
  except Exception:
24
- from urllib3.util import Retry # urllib3 v1 fallback
23
+ pass # urllib3 v1 fallback
25
24
 
26
25
  import os
27
26
  import dotenv
28
27
 
29
- from .classes import LMSWrapper, Student, Submission, Submission__Canvas, FileSubmission__Canvas, TextSubmission__Canvas, QuizSubmission
28
+ from .classes import LMSWrapper, Student, Submission, FileSubmission__Canvas, TextSubmission__Canvas, QuizSubmission
30
29
 
31
30
  import logging
32
31
 
@@ -6,7 +6,6 @@ import logging
6
6
  import dataclasses
7
7
  import functools
8
8
  import io
9
- import os
10
9
  import urllib.request
11
10
  from typing import Optional, List, Dict
12
11
 
@@ -6,6 +6,7 @@ import random
6
6
  import shutil
7
7
  import subprocess
8
8
  import tempfile
9
+ from datetime import datetime
9
10
  import traceback
10
11
  import re
11
12
  from pathlib import Path
@@ -296,7 +297,9 @@ def generate_latex(latex_text, remove_previous=False, name_prefix=None):
296
297
  tmp_tex.write(latex_text)
297
298
 
298
299
  tmp_tex.flush()
299
- shutil.copy(f"{tmp_tex.name}", "debug.tex")
300
+ os.makedirs(os.path.join("out", "debug"), exist_ok=True)
301
+ debug_name = f"debug-{datetime.now().strftime('%Y%m%d-%H%M%S')}.tex"
302
+ shutil.copy(f"{tmp_tex.name}", os.path.join("out", "debug", debug_name))
300
303
  p = subprocess.Popen(
301
304
  f"latexmk -pdf -output-directory={os.path.join(os.getcwd(), 'out')} {tmp_tex.name}",
302
305
  shell=True,
@@ -369,7 +372,9 @@ def generate_typst(typst_text, remove_previous=False, name_prefix=None):
369
372
  tmp_typ.close()
370
373
 
371
374
  # Save debug copy
372
- shutil.copy(tmp_typ.name, "debug.typ")
375
+ os.makedirs(os.path.join("out", "debug"), exist_ok=True)
376
+ debug_name = f"debug-{datetime.now().strftime('%Y%m%d-%H%M%S')}.typ"
377
+ shutil.copy(tmp_typ.name, os.path.join("out", "debug", debug_name))
373
378
 
374
379
  # Compile with typst
375
380
  output_pdf = os.path.join(os.getcwd(), 'out', os.path.basename(tmp_typ.name).replace('.typ', '.pdf'))
@@ -24,14 +24,14 @@ handlers:
24
24
  class: logging.FileHandler
25
25
  level: INFO
26
26
  formatter: detailed
27
- filename: ${LOG_FILE:-teachingtools.log}
27
+ filename: ${LOG_FILE:-out/logs/teachingtools.log}
28
28
  mode: a
29
29
 
30
30
  error_file:
31
31
  class: logging.FileHandler
32
32
  level: ERROR
33
33
  formatter: detailed
34
- filename: ${ERROR_LOG_FILE:-teachingtools_errors.log}
34
+ filename: ${ERROR_LOG_FILE:-out/logs/teachingtools_errors.log}
35
35
  mode: a
36
36
 
37
37
  loggers:
@@ -52,4 +52,4 @@ loggers:
52
52
 
53
53
  root:
54
54
  level: INFO
55
- handlers: [console, file, error_file]
55
+ handlers: [console, file, error_file]
@@ -1,17 +1,9 @@
1
1
  #!env python
2
2
  from __future__ import annotations
3
3
 
4
- import decimal
5
- import enum
6
- import itertools
7
4
  import logging
8
- import math
9
- import numpy as np
10
- from typing import List, Dict, Tuple, Any
11
5
 
12
- import fractions
13
6
 
14
- import QuizGenerator.contentast as ca
15
7
 
16
8
  log = logging.getLogger(__name__)
17
9
 
@@ -8,7 +8,7 @@ import enum
8
8
  import logging
9
9
  import random
10
10
  import math
11
- from typing import List, Optional
11
+ from typing import List
12
12
 
13
13
  import QuizGenerator.contentast as ca
14
14
  from QuizGenerator.question import Question, QuestionRegistry, RegenerableChoiceMixin
@@ -57,8 +57,7 @@ class VirtualAddressParts(MemoryQuestion, TableQuestionMixin):
57
57
  @classmethod
58
58
  def _build_body(cls, context):
59
59
  """Build question body and collect answers."""
60
- answer = context["possible_answers"][context["blank_kind"]]
61
-
60
+
62
61
  # Create table data with one blank cell
63
62
  table_data = [{}]
64
63
  for target in list(cls.Target):
@@ -387,7 +387,6 @@ class SchedulingQuestion(ProcessQuestion, RegenerableChoiceMixin, TableQuestionM
387
387
  Returns:
388
388
  Tuple of (body_ast, answers_list)
389
389
  """
390
- from typing import List
391
390
  answers: List[ca.Answer] = []
392
391
 
393
392
  # Create table data for scheduling results
@@ -0,0 +1,12 @@
1
+ from .gradient_descent_questions import GradientDescentWalkthrough
2
+ from .gradient_calculation import DerivativeBasic, DerivativeChain
3
+ from .loss_calculations import LossQuestion_Linear, LossQuestion_Logistic, LossQuestion_MulticlassLogistic
4
+
5
+ __all__ = [
6
+ "GradientDescentWalkthrough",
7
+ "DerivativeBasic",
8
+ "DerivativeChain",
9
+ "LossQuestion_Linear",
10
+ "LossQuestion_Logistic",
11
+ "LossQuestion_MulticlassLogistic",
12
+ ]
@@ -58,7 +58,6 @@ class DerivativeQuestion(Question, abc.ABC):
58
58
 
59
59
  # Create answer for each partial derivative
60
60
  for i in range(context.num_variables):
61
- answer_key = f"partial_derivative_{i}"
62
61
  # Evaluate the partial derivative and convert to float
63
62
  partial_value = context.gradient_function[i].subs(subs_map)
64
63
  try:
@@ -2,8 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import abc
4
4
  import logging
5
- import math
6
- from typing import List, Tuple, Callable, Union, Any
5
+ from typing import List, Tuple
7
6
 
8
7
  import sympy
9
8
  import sympy as sp
@@ -151,8 +150,7 @@ class GradientDescentWalkthrough(GradientDescentQuestion, TableQuestionMixin, Bo
151
150
 
152
151
  # Introduction
153
152
  objective = "minimize" if self.minimize else "maximize"
154
- sign = "-" if self.minimize else "+"
155
-
153
+
156
154
  body.add_element(
157
155
  ca.Paragraph(
158
156
  [
@@ -3,8 +3,7 @@ from __future__ import annotations
3
3
  import abc
4
4
  import logging
5
5
  import math
6
- import numpy as np
7
- from typing import List, Tuple, Dict, Any
6
+ from typing import List, Tuple
8
7
 
9
8
  import QuizGenerator.contentast as ca
10
9
  from QuizGenerator.question import Question, QuestionRegistry
@@ -1,5 +1,5 @@
1
1
 
2
- from typing import List, Tuple, Callable, Union, Any
2
+ from typing import List, Any
3
3
  import sympy as sp
4
4
 
5
5
  import QuizGenerator.contentast as ca
@@ -0,0 +1,12 @@
1
+ from .matrix_questions import MatrixAddition, MatrixScalarMultiplication, MatrixMultiplication
2
+ from .vector_questions import VectorAddition, VectorScalarMultiplication, VectorDotProduct, VectorMagnitude
3
+
4
+ __all__ = [
5
+ "MatrixAddition",
6
+ "MatrixScalarMultiplication",
7
+ "MatrixMultiplication",
8
+ "VectorAddition",
9
+ "VectorScalarMultiplication",
10
+ "VectorDotProduct",
11
+ "VectorMagnitude",
12
+ ]
@@ -1,5 +1,4 @@
1
1
  #!env python
2
- import abc
3
2
  import logging
4
3
  import random
5
4
  from typing import List, Tuple
@@ -3,7 +3,6 @@ import abc
3
3
  import logging
4
4
  import math
5
5
  import random
6
- from typing import List
7
6
 
8
7
  from QuizGenerator.question import Question, QuestionRegistry
9
8
  import QuizGenerator.contentast as ca
@@ -1,12 +1,9 @@
1
- import abc
2
1
  import logging
3
- import math
4
2
  import numpy as np
5
3
  from typing import List, Tuple
6
4
 
7
- from QuizGenerator.question import Question, QuestionRegistry
5
+ from QuizGenerator.question import QuestionRegistry
8
6
  import QuizGenerator.contentast as ca
9
- from QuizGenerator.constants import MathRanges
10
7
  from QuizGenerator.mixins import TableQuestionMixin
11
8
 
12
9
  from .matrices import MatrixQuestion
@@ -1,12 +1,9 @@
1
- import abc
2
1
  import logging
3
- import math
4
2
  import numpy as np
5
3
  from typing import List, Tuple
6
4
 
7
- from QuizGenerator.question import Question, QuestionRegistry
5
+ from QuizGenerator.question import QuestionRegistry
8
6
  import QuizGenerator.contentast as ca
9
- from QuizGenerator.constants import MathRanges
10
7
  from .matrices import MatrixQuestion
11
8
 
12
9
  log = logging.getLogger(__name__)
@@ -1,13 +1,10 @@
1
- import abc
2
1
  import logging
3
- import math
4
2
  import numpy as np
5
3
  from typing import List, Tuple
6
4
 
7
5
  from .matrices import MatrixQuestion
8
- from QuizGenerator.question import Question, QuestionRegistry
6
+ from QuizGenerator.question import QuestionRegistry
9
7
  import QuizGenerator.contentast as ca
10
- from QuizGenerator.constants import MathRanges
11
8
  from QuizGenerator.mixins import TableQuestionMixin
12
9
 
13
10
  log = logging.getLogger(__name__)
@@ -1,13 +1,10 @@
1
- import abc
2
1
  import logging
3
- import math
4
2
  import numpy as np
5
3
  from typing import List, Tuple
6
4
 
7
5
  from QuizGenerator.premade_questions.cst463.models.matrices import MatrixQuestion
8
- from QuizGenerator.question import Question, QuestionRegistry
6
+ from QuizGenerator.question import QuestionRegistry
9
7
  import QuizGenerator.contentast as ca
10
- from QuizGenerator.constants import MathRanges
11
8
  from QuizGenerator.mixins import TableQuestionMixin
12
9
 
13
10
  log = logging.getLogger(__name__)
@@ -2,7 +2,6 @@ from __future__ import annotations
2
2
 
3
3
  import abc
4
4
  import logging
5
- import math
6
5
  import random
7
6
  try:
8
7
  import keras
@@ -16,7 +15,6 @@ from typing import List, Tuple
16
15
 
17
16
  from QuizGenerator.question import Question, QuestionRegistry
18
17
  import QuizGenerator.contentast as ca
19
- from QuizGenerator.constants import MathRanges
20
18
 
21
19
  log = logging.getLogger(__name__)
22
20
 
@@ -4,3 +4,10 @@ from .neural_network_questions import (
4
4
  EnsembleAveragingQuestion,
5
5
  EndToEndTrainingQuestion
6
6
  )
7
+
8
+ __all__ = [
9
+ "ForwardPassQuestion",
10
+ "BackpropGradientQuestion",
11
+ "EnsembleAveragingQuestion",
12
+ "EndToEndTrainingQuestion",
13
+ ]
@@ -3,18 +3,13 @@ from __future__ import annotations
3
3
  import abc
4
4
  import io
5
5
  import logging
6
- import math
7
6
  import numpy as np
8
- import uuid
9
- import os
10
7
  from typing import List, Tuple
11
8
 
12
9
  import matplotlib.pyplot as plt
13
- import matplotlib.patches as mpatches
14
10
 
15
11
  import QuizGenerator.contentast as ca
16
12
  from QuizGenerator.question import Question, QuestionRegistry
17
- from QuizGenerator.mixins import TableQuestionMixin, BodyTemplatesMixin
18
13
  from ..models.matrices import MatrixQuestion
19
14
 
20
15
  log = logging.getLogger(__name__)
@@ -843,8 +838,7 @@ class BackpropGradientQuestion(SimpleNeuralNetworkBase):
843
838
  # Compute intermediate values
844
839
  dz2_da1 = self.W2[0, 0]
845
840
  da1_dz1 = self._activation_derivative(self.z1[0])
846
- dL_dz1 = self.dL_dz2 * dz2_da1 * da1_dz1
847
-
841
+
848
842
  grad = self._compute_gradient_W1(0, j)
849
843
 
850
844
  if self.activation_function == self.ACTIVATION_SIGMOID:
@@ -1131,7 +1125,6 @@ class EndToEndTrainingQuestion(SimpleNeuralNetworkBase):
1131
1125
  ]))
1132
1126
 
1133
1127
  # Hidden layer
1134
- z1_0 = self.W1[0, 0] * self.X[0] + self.W1[0, 1] * self.X[1] + self.b1[0]
1135
1128
  explanation.add_element(ca.Equation(
1136
1129
  f"z_1 = w_{{11}} x_1 + w_{{12}} x_2 + b_1 = {self.W1[0,0]:.{self.param_digits}f} \\cdot {self.X[0]:.1f} + {self.W1[0,1]:.{self.param_digits}f} \\cdot {self.X[1]:.1f} + {self.b1[0]:.{self.param_digits}f} = {self.z1[0]:.4f}",
1137
1130
  inline=False
@@ -1149,7 +1142,6 @@ class EndToEndTrainingQuestion(SimpleNeuralNetworkBase):
1149
1142
  ))
1150
1143
 
1151
1144
  # Output (pre-activation)
1152
- z2 = self.W2[0, 0] * self.a1[0] + self.W2[0, 1] * self.a1[1] + self.b2[0]
1153
1145
  explanation.add_element(ca.Equation(
1154
1146
  f"z_{{out}} = w_3 h_1 + w_4 h_2 + b_2 = {self.W2[0,0]:.{self.param_digits}f} \\cdot {self.a1[0]:.4f} + {self.W2[0,1]:.{self.param_digits}f} \\cdot {self.a1[1]:.4f} + {self.b2[0]:.{self.param_digits}f} = {self.z2[0]:.4f}",
1155
1147
  inline=False
@@ -4,3 +4,10 @@ from .tensorflow_questions import (
4
4
  RegularizationCalculationQuestion,
5
5
  MomentumOptimizerQuestion
6
6
  )
7
+
8
+ __all__ = [
9
+ "ParameterCountingQuestion",
10
+ "ActivationFunctionComputationQuestion",
11
+ "RegularizationCalculationQuestion",
12
+ "MomentumOptimizerQuestion",
13
+ ]
@@ -1,9 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- import abc
4
- import io
5
3
  import logging
6
- import re
7
4
  import numpy as np
8
5
  import sympy as sp
9
6
  from typing import List, Tuple
@@ -900,7 +897,6 @@ class MomentumOptimizerQuestion(Question, TableQuestionMixin, BodyTemplatesMixin
900
897
  # Show calculation for each component
901
898
  digits = ca.Answer.DEFAULT_ROUNDING_DIGITS
902
899
  for i in range(context.num_variables):
903
- var_name = f"x_{i}"
904
900
  # Round all intermediate values to avoid floating point precision issues
905
901
  beta_times_v = round(context.momentum_beta * context.prev_velocity[i], digits)
906
902
  one_minus_beta = round(1 - context.momentum_beta, digits)
@@ -17,7 +17,6 @@ import os
17
17
  import tempfile
18
18
  import zlib
19
19
  from datetime import datetime
20
- from io import BytesIO
21
20
  from pathlib import Path
22
21
  from typing import Optional, Dict, Any
23
22
 
@@ -11,16 +11,12 @@ import itertools
11
11
  import os
12
12
  import pathlib
13
13
  import pkgutil
14
- import pprint
15
14
  import random
16
- import re
17
15
  import uuid
18
16
  import types
19
17
  import inspect
20
18
  from types import MappingProxyType
21
19
 
22
- import pypandoc
23
- import yaml
24
20
  from typing import List, Dict, Any, Tuple, Optional, Mapping, MutableMapping
25
21
  import canvasapi.course, canvasapi.quiz
26
22
 
@@ -622,12 +618,6 @@ class Question(abc.ABC):
622
618
  }
623
619
  self.config_params = {k: v for k, v in kwargs.items() if k not in framework_params}
624
620
 
625
- @classmethod
626
- def from_yaml(cls, path_to_yaml):
627
- with open(path_to_yaml) as fid:
628
- question_dicts = yaml.safe_load_all(fid)
629
-
630
-
631
621
  def instantiate(self, **kwargs) -> QuestionInstance:
632
622
  """
633
623
  Instantiate a question once, returning content, answers, and regeneration metadata.
@@ -2,15 +2,10 @@
2
2
  from __future__ import annotations
3
3
 
4
4
  import collections
5
- import itertools
6
5
  import logging
7
- import os.path
8
6
  import random
9
- import shutil
10
- import subprocess
11
- import tempfile
12
7
  from datetime import datetime
13
- from typing import List, Dict, Optional
8
+ from typing import List
14
9
  import re
15
10
 
16
11
  import yaml
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "QuizGenerator"
7
- version = "0.9.0"
7
+ version = "0.10.1"
8
8
  description = "Generate randomized quiz questions for Canvas LMS and PDF exams"
9
9
  readme = "README.md"
10
10
  license = {text = "GPL-3.0-or-later"}
@@ -16,7 +16,6 @@ import argparse
16
16
  import re
17
17
  import shutil
18
18
  import sys
19
- import os
20
19
  from pathlib import Path
21
20
  from datetime import datetime
22
21
 
@@ -1214,7 +1214,7 @@ wheels = [
1214
1214
 
1215
1215
  [[package]]
1216
1216
  name = "quizgenerator"
1217
- version = "0.10.0"
1217
+ version = "0.10.1"
1218
1218
  source = { editable = "." }
1219
1219
  dependencies = [
1220
1220
  { name = "canvasapi" },
@@ -1,3 +0,0 @@
1
- from .gradient_descent_questions import GradientDescentWalkthrough
2
- from .gradient_calculation import DerivativeBasic, DerivativeChain
3
- from .loss_calculations import LossQuestion_Linear, LossQuestion_Logistic, LossQuestion_MulticlassLogistic
@@ -1,2 +0,0 @@
1
- from .matrix_questions import MatrixAddition, MatrixScalarMultiplication, MatrixMultiplication
2
- from .vector_questions import VectorAddition, VectorScalarMultiplication, VectorDotProduct, VectorMagnitude
File without changes
File without changes
File without changes
File without changes
File without changes