QuizGenerator 0.7.0__py3-none-any.whl → 0.8.0__py3-none-any.whl

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 (30) hide show
  1. QuizGenerator/contentast.py +6 -6
  2. QuizGenerator/generate.py +2 -1
  3. QuizGenerator/mixins.py +14 -100
  4. QuizGenerator/premade_questions/basic.py +24 -29
  5. QuizGenerator/premade_questions/cst334/languages.py +100 -99
  6. QuizGenerator/premade_questions/cst334/math_questions.py +112 -122
  7. QuizGenerator/premade_questions/cst334/memory_questions.py +621 -621
  8. QuizGenerator/premade_questions/cst334/persistence_questions.py +137 -163
  9. QuizGenerator/premade_questions/cst334/process.py +312 -322
  10. QuizGenerator/premade_questions/cst463/gradient_descent/gradient_calculation.py +34 -35
  11. QuizGenerator/premade_questions/cst463/gradient_descent/gradient_descent_questions.py +41 -36
  12. QuizGenerator/premade_questions/cst463/gradient_descent/loss_calculations.py +48 -41
  13. QuizGenerator/premade_questions/cst463/math_and_data/matrix_questions.py +285 -520
  14. QuizGenerator/premade_questions/cst463/math_and_data/vector_questions.py +149 -126
  15. QuizGenerator/premade_questions/cst463/models/attention.py +44 -50
  16. QuizGenerator/premade_questions/cst463/models/cnns.py +43 -47
  17. QuizGenerator/premade_questions/cst463/models/matrices.py +61 -11
  18. QuizGenerator/premade_questions/cst463/models/rnns.py +48 -50
  19. QuizGenerator/premade_questions/cst463/models/text.py +65 -67
  20. QuizGenerator/premade_questions/cst463/models/weight_counting.py +47 -46
  21. QuizGenerator/premade_questions/cst463/neural-network-basics/neural_network_questions.py +100 -156
  22. QuizGenerator/premade_questions/cst463/tensorflow-intro/tensorflow_questions.py +93 -141
  23. QuizGenerator/question.py +273 -202
  24. QuizGenerator/quiz.py +8 -5
  25. QuizGenerator/regenerate.py +128 -19
  26. {quizgenerator-0.7.0.dist-info → quizgenerator-0.8.0.dist-info}/METADATA +30 -2
  27. {quizgenerator-0.7.0.dist-info → quizgenerator-0.8.0.dist-info}/RECORD +30 -30
  28. {quizgenerator-0.7.0.dist-info → quizgenerator-0.8.0.dist-info}/WHEEL +0 -0
  29. {quizgenerator-0.7.0.dist-info → quizgenerator-0.8.0.dist-info}/entry_points.txt +0 -0
  30. {quizgenerator-0.7.0.dist-info → quizgenerator-0.8.0.dist-info}/licenses/LICENSE +0 -0
QuizGenerator/quiz.py CHANGED
@@ -206,10 +206,10 @@ class Quiz:
206
206
  if check_typst_available():
207
207
  try:
208
208
  # Render question to Typst
209
- question_ast = question.get_question(**kwargs)
209
+ instance = question.instantiate(**kwargs)
210
210
 
211
211
  # Get just the content body (without the #question wrapper which adds spacing)
212
- typst_body = question_ast.body.render("typst", **kwargs)
212
+ typst_body = instance.body.render("typst", **kwargs)
213
213
 
214
214
  # Measure the content
215
215
  measured_height = measure_typst_content(typst_body, page_width_cm=18.0)
@@ -236,7 +236,8 @@ class Quiz:
236
236
  spacing_height = question.spacing # cm
237
237
 
238
238
  # Estimate content height by rendering to LaTeX and analyzing structure
239
- question_ast = question.get_question(**kwargs)
239
+ instance = question.instantiate(**kwargs)
240
+ question_ast = question._build_question_ast(instance)
240
241
  latex_content = question_ast.render("latex")
241
242
 
242
243
  # Count content that adds height (rough estimates in cm)
@@ -451,9 +452,11 @@ class Quiz:
451
452
  # Generate a unique seed for this question from the master seed
452
453
  if master_seed is not None:
453
454
  question_seed = master_rng.randint(0, 2**31 - 1)
454
- question_ast = question.get_question(rng_seed=question_seed, **kwargs)
455
+ instance = question.instantiate(rng_seed=question_seed, **kwargs)
456
+ question_ast = question._build_question_ast(instance)
455
457
  else:
456
- question_ast = question.get_question(**kwargs)
458
+ instance = question.instantiate(**kwargs)
459
+ question_ast = question._build_question_ast(instance)
457
460
 
458
461
  # Add question number to the AST for QR code generation
459
462
  question_ast.question_number = question_number
@@ -39,12 +39,13 @@ the exact question and answer without needing the original exam file.
39
39
  """
40
40
 
41
41
  import argparse
42
+ import base64
42
43
  import json
43
44
  import sys
44
45
  import logging
45
46
  import os
46
47
  from pathlib import Path
47
- from typing import Dict, Any, Optional, List
48
+ from typing import Dict, Any, Optional, List, Callable
48
49
 
49
50
  # Load environment variables from .env file
50
51
  try:
@@ -140,7 +141,39 @@ def parse_qr_data(qr_string: str) -> Dict[str, Any]:
140
141
  return {}
141
142
 
142
143
 
143
- def regenerate_question_answer(qr_data: Dict[str, Any]) -> Optional[Dict[str, Any]]:
144
+ def _inline_image_upload(img_data) -> str:
145
+ img_data.seek(0)
146
+ b64 = base64.b64encode(img_data.read()).decode("ascii")
147
+ return f"data:image/png;base64,{b64}"
148
+
149
+
150
+ def _resolve_upload_func(
151
+ image_mode: str,
152
+ upload_func: Optional[Callable]
153
+ ) -> Optional[Callable]:
154
+ if image_mode == "inline":
155
+ return _inline_image_upload
156
+ if image_mode == "upload":
157
+ if upload_func is None:
158
+ raise ValueError("image_mode='upload' requires upload_func")
159
+ return upload_func
160
+ if image_mode == "none":
161
+ return None
162
+ raise ValueError(f"Unknown image_mode: {image_mode}")
163
+
164
+
165
+ def _render_html(element, upload_func=None, **kwargs) -> str:
166
+ if upload_func is None:
167
+ return element.render("html", **kwargs)
168
+ return element.render("html", upload_func=upload_func, **kwargs)
169
+
170
+
171
+ def regenerate_question_answer(
172
+ qr_data: Dict[str, Any],
173
+ *,
174
+ image_mode: str = "inline",
175
+ upload_func: Optional[Callable] = None
176
+ ) -> Optional[Dict[str, Any]]:
144
177
  """
145
178
  Regenerate question and extract answer using QR code metadata.
146
179
 
@@ -156,8 +189,9 @@ def regenerate_question_answer(qr_data: Dict[str, Any]) -> Optional[Dict[str, An
156
189
  "seed": int,
157
190
  "version": str,
158
191
  "answers": dict,
159
- "explanation_markdown": str | None # Markdown explanation (None if not available)
160
- }
192
+ "explanation_markdown": str | None # Markdown explanation (None if not available)
193
+ "explanation_html": str | None # HTML explanation (None if not available)
194
+ }
161
195
  """
162
196
  question_num = qr_data.get('q')
163
197
  points = qr_data.get('pts')
@@ -207,10 +241,14 @@ def regenerate_question_answer(qr_data: Dict[str, Any]) -> Optional[Dict[str, An
207
241
  )
208
242
 
209
243
  # Generate question with the specific seed
210
- question_ast = question.get_question(rng_seed=seed)
244
+ instance = question.instantiate(rng_seed=seed)
245
+ question_ast = question._build_question_ast(instance)
211
246
 
212
247
  # Extract answers
213
- answer_kind, canvas_answers = question.get_answers()
248
+ answer_kind, canvas_answers = question._answers_for_canvas(
249
+ instance.answers,
250
+ instance.can_be_numerical
251
+ )
214
252
 
215
253
  result['answers'] = {
216
254
  'kind': answer_kind.value,
@@ -218,10 +256,16 @@ def regenerate_question_answer(qr_data: Dict[str, Any]) -> Optional[Dict[str, An
218
256
  }
219
257
 
220
258
  # Also store the raw answer objects for easier access
221
- result['answer_objects'] = question.answers
259
+ result['answer_objects'] = instance.answers
222
260
 
261
+ resolved_upload_func = _resolve_upload_func(image_mode, upload_func)
262
+
223
263
  # Generate HTML answer key for grading
224
- question_html = question_ast.body.render("html", show_answers=True)
264
+ question_html = _render_html(
265
+ question_ast.body,
266
+ show_answers=True,
267
+ upload_func=resolved_upload_func
268
+ )
225
269
  result['answer_key_html'] = question_html
226
270
 
227
271
  # Generate markdown explanation for students
@@ -232,6 +276,16 @@ def regenerate_question_answer(qr_data: Dict[str, Any]) -> Optional[Dict[str, An
232
276
  else:
233
277
  result['explanation_markdown'] = explanation_markdown
234
278
 
279
+ # Generate HTML explanation (optional for web UIs)
280
+ explanation_html = _render_html(
281
+ question_ast.explanation,
282
+ upload_func=resolved_upload_func
283
+ )
284
+ if not explanation_html or "[Please reach out to your professor for clarification]" in explanation_html:
285
+ result["explanation_html"] = None
286
+ else:
287
+ result["explanation_html"] = explanation_html
288
+
235
289
  log.info(f" Successfully regenerated question with {len(canvas_answers)} answer(s)")
236
290
 
237
291
  return result
@@ -243,7 +297,13 @@ def regenerate_question_answer(qr_data: Dict[str, Any]) -> Optional[Dict[str, An
243
297
  return result
244
298
 
245
299
 
246
- def regenerate_from_encrypted(encrypted_data: str, points: float = 1.0) -> Dict[str, Any]:
300
+ def regenerate_from_encrypted(
301
+ encrypted_data: str,
302
+ points: float = 1.0,
303
+ *,
304
+ image_mode: str = "inline",
305
+ upload_func: Optional[Callable] = None
306
+ ) -> Dict[str, Any]:
247
307
  """
248
308
  Regenerate question answers from encrypted QR code data (RECOMMENDED API).
249
309
 
@@ -253,6 +313,8 @@ def regenerate_from_encrypted(encrypted_data: str, points: float = 1.0) -> Dict[
253
313
  Args:
254
314
  encrypted_data: The encrypted 's' field from the QR code JSON
255
315
  points: Point value for the question (default: 1.0)
316
+ image_mode: "inline", "upload", or "none" for HTML image handling
317
+ upload_func: Optional upload function used when image_mode="upload"
256
318
 
257
319
  Returns:
258
320
  Dictionary with regenerated answers:
@@ -266,6 +328,7 @@ def regenerate_from_encrypted(encrypted_data: str, points: float = 1.0) -> Dict[
266
328
  "answer_objects": dict, # Raw Answer objects with values/tolerances
267
329
  "answer_key_html": str, # HTML rendering of question with answers shown
268
330
  "explanation_markdown": str | None # Markdown explanation (None if not available)
331
+ "explanation_html": str | None # HTML explanation (None if not available)
269
332
  }
270
333
 
271
334
  Raises:
@@ -287,12 +350,21 @@ def regenerate_from_encrypted(encrypted_data: str, points: float = 1.0) -> Dict[
287
350
  kwargs = decrypted.get('config', {})
288
351
 
289
352
  # Use the existing regeneration logic
290
- return regenerate_from_metadata(question_type, seed, version, points, kwargs)
353
+ return regenerate_from_metadata(
354
+ question_type,
355
+ seed,
356
+ version,
357
+ points,
358
+ kwargs,
359
+ image_mode=image_mode,
360
+ upload_func=upload_func
361
+ )
291
362
 
292
363
 
293
364
  def regenerate_from_metadata(
294
365
  question_type: str, seed: int, version: str,
295
- points: float = 1.0, kwargs: Optional[Dict[str, Any]] = None
366
+ points: float = 1.0, kwargs: Optional[Dict[str, Any]] = None,
367
+ *, image_mode: str = "inline", upload_func: Optional[Callable] = None
296
368
  ) -> Dict[str, Any]:
297
369
  """
298
370
  Regenerate question answers from explicit metadata fields.
@@ -306,6 +378,8 @@ def regenerate_from_metadata(
306
378
  points: Point value for the question (default: 1.0)
307
379
  kwargs: Optional dictionary of question-specific configuration parameters
308
380
  (e.g., {"num_bits_va": 32, "max_value": 100})
381
+ image_mode: "inline", "upload", or "none" for HTML image handling
382
+ upload_func: Optional upload function used when image_mode="upload"
309
383
 
310
384
  Returns:
311
385
  Dictionary with regenerated answers (same format as regenerate_from_encrypted)
@@ -330,13 +404,23 @@ def regenerate_from_metadata(
330
404
  )
331
405
 
332
406
  # Generate question with the specific seed
333
- question_ast = question.get_question(rng_seed=seed)
407
+ instance = question.instantiate(rng_seed=seed)
408
+ question_ast = question._build_question_ast(instance)
334
409
 
335
410
  # Extract answers
336
- answer_kind, canvas_answers = question.get_answers()
411
+ answer_kind, canvas_answers = question._answers_for_canvas(
412
+ instance.answers,
413
+ instance.can_be_numerical
414
+ )
337
415
 
416
+ resolved_upload_func = _resolve_upload_func(image_mode, upload_func)
417
+
338
418
  # Generate HTML answer key for grading
339
- question_html = question_ast.body.render("html", show_answers=True)
419
+ question_html = _render_html(
420
+ question_ast.body,
421
+ show_answers=True,
422
+ upload_func=resolved_upload_func
423
+ )
340
424
 
341
425
  # Generate markdown explanation for students
342
426
  explanation_markdown = question_ast.explanation.render("markdown")
@@ -344,6 +428,13 @@ def regenerate_from_metadata(
344
428
  if not explanation_markdown or "[Please reach out to your professor for clarification]" in explanation_markdown:
345
429
  explanation_markdown = None
346
430
 
431
+ explanation_html = _render_html(
432
+ question_ast.explanation,
433
+ upload_func=resolved_upload_func
434
+ )
435
+ if not explanation_html or "[Please reach out to your professor for clarification]" in explanation_html:
436
+ explanation_html = None
437
+
347
438
  result = {
348
439
  "question_type": question_type,
349
440
  "seed": seed,
@@ -353,9 +444,10 @@ def regenerate_from_metadata(
353
444
  "kind": answer_kind.value,
354
445
  "data": canvas_answers
355
446
  },
356
- "answer_objects": question.answers,
447
+ "answer_objects": instance.answers,
357
448
  "answer_key_html": question_html,
358
- "explanation_markdown": explanation_markdown
449
+ "explanation_markdown": explanation_markdown,
450
+ "explanation_html": explanation_html
359
451
  }
360
452
 
361
453
  # Include kwargs in result if provided
@@ -407,6 +499,9 @@ def display_answer_summary(question_data: Dict[str, Any]) -> None:
407
499
  if 'explanation_markdown' in question_data and question_data['explanation_markdown'] is not None:
408
500
  print("Markdown explanation available in result['explanation_markdown']")
409
501
 
502
+ if 'explanation_html' in question_data and question_data['explanation_html'] is not None:
503
+ print("HTML explanation available in result['explanation_html']")
504
+
410
505
  print("=" * 60)
411
506
 
412
507
 
@@ -445,6 +540,12 @@ def main():
445
540
  action='store_true',
446
541
  help='Enable verbose debug logging'
447
542
  )
543
+ parser.add_argument(
544
+ '--image-mode',
545
+ choices=['inline', 'none'],
546
+ default='inline',
547
+ help='HTML image handling (default: inline)'
548
+ )
448
549
 
449
550
  args = parser.parse_args()
450
551
 
@@ -467,7 +568,11 @@ def main():
467
568
  if args.encrypted_str:
468
569
  try:
469
570
  log.info(f"Decoding encrypted string (points={args.points})")
470
- result = regenerate_from_encrypted(args.encrypted_str, args.points)
571
+ result = regenerate_from_encrypted(
572
+ args.encrypted_str,
573
+ args.points,
574
+ image_mode=args.image_mode
575
+ )
471
576
 
472
577
  # Format result similar to regenerate_question_answer output
473
578
  question_data = {
@@ -479,7 +584,8 @@ def main():
479
584
  "answers": result["answers"],
480
585
  "answer_objects": result["answer_objects"],
481
586
  "answer_key_html": result["answer_key_html"],
482
- "explanation_markdown": result.get("explanation_markdown")
587
+ "explanation_markdown": result.get("explanation_markdown"),
588
+ "explanation_html": result.get("explanation_html")
483
589
  }
484
590
 
485
591
  if "kwargs" in result:
@@ -517,7 +623,10 @@ def main():
517
623
  continue
518
624
 
519
625
  # Regenerate question and answer
520
- question_data = regenerate_question_answer(qr_data)
626
+ question_data = regenerate_question_answer(
627
+ qr_data,
628
+ image_mode=args.image_mode
629
+ )
521
630
 
522
631
  if question_data:
523
632
  results.append(question_data)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: QuizGenerator
3
- Version: 0.7.0
3
+ Version: 0.8.0
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
@@ -144,6 +144,34 @@ questions:
144
144
 
145
145
  See [documentation/custom_questions.md](documentation/custom_questions.md) for complete guide.
146
146
 
147
+ ### Question Authoring Pattern (New)
148
+
149
+ All questions follow the same three‑method flow:
150
+
151
+ ```python
152
+ class MyQuestion(Question):
153
+ def _build_context(self, *, rng_seed=None, **kwargs):
154
+ context = super()._build_context(rng_seed=rng_seed, **kwargs)
155
+ rng = context["rng"]
156
+ context["value"] = rng.randint(1, 10)
157
+ return context
158
+
159
+ def _build_body(self, context):
160
+ body = ca.Section()
161
+ body.add_element(ca.Paragraph([f"Value: {context['value']}"]))
162
+ body.add_element(ca.AnswerTypes.Int(context["value"], label="Value"))
163
+ return body
164
+
165
+ def _build_explanation(self, context):
166
+ explanation = ca.Section()
167
+ explanation.add_element(ca.Paragraph([f"Answer: {context['value']}"]))
168
+ return explanation
169
+ ```
170
+
171
+ Notes:
172
+ - Always use `context["rng"]` for deterministic randomness.
173
+ - Avoid `refresh()`; it is no longer part of the API.
174
+
147
175
  ## Built-in Question Types
148
176
 
149
177
  ### Operating Systems (CST334)
@@ -262,4 +290,4 @@ If you use QuizGenerator in academic work, please cite:
262
290
 
263
291
  ---
264
292
 
265
- **Note**: This tool is designed for educational use. Ensure compliance with your institution's academic integrity policies when using automated quiz generation.
293
+ **Note**: This tool is designed for educational use. Ensure compliance with your institution's academic integrity policies when using automated quiz generation.
@@ -1,50 +1,50 @@
1
1
  QuizGenerator/__init__.py,sha256=8EV-k90A3PNC8Cm2-ZquwNyVyvnwW1gs6u-nGictyhs,840
2
2
  QuizGenerator/__main__.py,sha256=Dd9w4R0Unm3RiXztvR4Y_g9-lkWp6FHg-4VN50JbKxU,151
3
3
  QuizGenerator/constants.py,sha256=AO-UWwsWPLb1k2JW6KP8rl9fxTcdT0rW-6XC6zfnDOs,4386
4
- QuizGenerator/contentast.py,sha256=8i7iF3cxcYbrVkpK89WdwhNtH4Bo25_rqDCxrSc0z8s,86281
5
- QuizGenerator/generate.py,sha256=AWzNL0QTYDTcJFKaYfHIoRHvhx9MYRAbsD6z7E5_c9k,15733
4
+ QuizGenerator/contentast.py,sha256=6eqhgjAGrkFQUoEOnnEuGIyllGnNC4354aP8IvnGCx4,86316
5
+ QuizGenerator/generate.py,sha256=dqF-WWmWxyJmPHl0gTYr3gNNxyF877fvXYaMvYA3uA8,15790
6
6
  QuizGenerator/misc.py,sha256=MXrguUhhdrWSV4Hqdl4G21ktowODu1AcKy6-5mvy3aI,454
7
- QuizGenerator/mixins.py,sha256=aFn2573APCh-XKn6U7Xy95Iyj1a-BsRXnorjpN1FT6E,18711
7
+ QuizGenerator/mixins.py,sha256=B9Ee52wUCeclmBTgonasHNo0WHvVOcnILsz0iecrf78,15705
8
8
  QuizGenerator/performance.py,sha256=CM3zLarJXN5Hfrl4-6JRBqD03j4BU1B2QW699HAr1Ds,7002
9
9
  QuizGenerator/qrcode_generator.py,sha256=S3mzZDk2UiHiw6ipSCpWPMhbKvSRR1P5ordZJUTo6ug,10776
10
- QuizGenerator/question.py,sha256=CqKq_-HDzETrgEr-E8fQu1sRiMZv6ZoBAjig6gy34vw,31395
11
- QuizGenerator/quiz.py,sha256=4W_3xZMLx-pMzB5mn8GOhbmE-7bYiIqYLtsVYxJSdVc,21463
12
- QuizGenerator/regenerate.py,sha256=Uh4B9aKQvL3zD7PT-uH-GvrcSuUygV1BimvPVuErc-g,16525
10
+ QuizGenerator/question.py,sha256=cfhCViOSI4p7rcQHE2igv1-aWZgyEKU6rUqJ25VHkfU,32304
11
+ QuizGenerator/quiz.py,sha256=CEWy7FB7BZiK33s_wYs6MqGKDetc6htUaqvP3--2HzI,21621
12
+ QuizGenerator/regenerate.py,sha256=ZAs1mtERmO8JXza2tBqJpd-uJs9V7gS1jJ9A9gSb8jo,19764
13
13
  QuizGenerator/typst_utils.py,sha256=JGQn_u5bEHd8HAtjAHuZoVJwLkx-Rd4ZCBWffwFZa3o,3136
14
14
  QuizGenerator/canvas/__init__.py,sha256=TwFP_zgxPIlWtkvIqQ6mcvBNTL9swIH_rJl7DGKcvkQ,286
15
15
  QuizGenerator/canvas/canvas_interface.py,sha256=StMcdXgLvTA1EayQ44m_le2GXGQpDQnduYXVeUYsqW0,24618
16
16
  QuizGenerator/canvas/classes.py,sha256=v_tQ8t_JJplU9sv2p4YctX45Fwed1nQ2HC1oC9BnDNw,7594
17
17
  QuizGenerator/premade_questions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
- QuizGenerator/premade_questions/basic.py,sha256=hZCZHZxyTAQSDr-Hwo3xIMlU3L0-tyzfEZqvz7B-P64,3317
18
+ QuizGenerator/premade_questions/basic.py,sha256=F_Qsu14b2xERyibCAMP1NPgnmi1h2G2DDkKJoU_RS8g,3284
19
19
  QuizGenerator/premade_questions/cst334/__init__.py,sha256=BTz-Os1XbwIRKqAilf2UIva2NlY0DbA_XbSIggO2Tdk,36
20
- QuizGenerator/premade_questions/cst334/languages.py,sha256=t4LEfVeJei0xqOHjUb9vV4yG1Oyp-LE-wmF4AY_oMbk,14909
21
- QuizGenerator/premade_questions/cst334/math_questions.py,sha256=TW4VR6kmcYC8qMOn5vNwe1_7OCUKjPeOqJbwoKOWZ-s,9930
22
- QuizGenerator/premade_questions/cst334/memory_questions.py,sha256=S_Fndsq-RqWoFeIuKmMmCrdO7R1dFeQ0HrGWu93RRiE,53749
20
+ QuizGenerator/premade_questions/cst334/languages.py,sha256=ctemEAMkI8C6ASMIf59EHAW1ndFWi7hXzdEt-zOByUE,14114
21
+ QuizGenerator/premade_questions/cst334/math_questions.py,sha256=aUYbQxneL5MXE7Xo3tZX9-xcg71CXwvG3rrxcoh0l7A,8638
22
+ QuizGenerator/premade_questions/cst334/memory_questions.py,sha256=g0EFJ2HUogYnOYMWYyn-z4lEv15Pfv5IdSvj0xGoKbI,51050
23
23
  QuizGenerator/premade_questions/cst334/ostep13_vsfs.py,sha256=d9jjrynEw44vupAH_wKl57UoHooCNEJXaC5DoNYualk,16163
24
- QuizGenerator/premade_questions/cst334/persistence_questions.py,sha256=eyCIwfy3pmSm-XEwIV-7i9uU0-kZcuq1D0Apm0m2SfA,17163
25
- QuizGenerator/premade_questions/cst334/process.py,sha256=YrtrLZA8Uk63adpD2WOuXyIaJsFKoO5xZ0yYDzMFWqs,39593
24
+ QuizGenerator/premade_questions/cst334/persistence_questions.py,sha256=9mgsX-3oWDQgm_n2YwmFSil0QPyzsruHzuqB-hfGMuA,16220
25
+ QuizGenerator/premade_questions/cst334/process.py,sha256=J9sk-tXeuCDFk2hHm_h9XJE40avacQWPNGf92yp4EjA,37682
26
26
  QuizGenerator/premade_questions/cst463/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
27
  QuizGenerator/premade_questions/cst463/gradient_descent/__init__.py,sha256=sH2CUV6zK9FT3jWTn453ys6_JTrUKRtZnU8hK6RmImU,240
28
- QuizGenerator/premade_questions/cst463/gradient_descent/gradient_calculation.py,sha256=6TzPi-NMI5CILcd3gbzRpEs3T_280SzA1kauTZMXC_g,13607
29
- QuizGenerator/premade_questions/cst463/gradient_descent/gradient_descent_questions.py,sha256=fEpYB4jFOJfyDdli0oh-zpsarC_w8fIGZBOXCkMOIGQ,10604
30
- QuizGenerator/premade_questions/cst463/gradient_descent/loss_calculations.py,sha256=Tq_-EVaVmuVz6-V9Wbcp-oIlc2BJ5ehN4MdCx8G_Dk4,21824
28
+ QuizGenerator/premade_questions/cst463/gradient_descent/gradient_calculation.py,sha256=laBeC0tMc2EaLzCotGHQNzePPPOKS1EGgQirigNyi9M,13479
29
+ QuizGenerator/premade_questions/cst463/gradient_descent/gradient_descent_questions.py,sha256=_2HlC0sqfGy__Qyzbw0PwMD_OkQiiQukl72LQFyPYx0,10939
30
+ QuizGenerator/premade_questions/cst463/gradient_descent/loss_calculations.py,sha256=8GtJX1DNNox-AgMvABFkRgmHB-lvrxMZKzv-3Ils_Jg,22380
31
31
  QuizGenerator/premade_questions/cst463/gradient_descent/misc.py,sha256=0R-nFeD3zsqJyde5CXWrF6Npjmpx6_HbzfCbThLi3os,2657
32
32
  QuizGenerator/premade_questions/cst463/math_and_data/__init__.py,sha256=EbIaUrx7_aK9j3Gd8Mk08h9GocTq_0OoNu2trfNwaU8,202
33
- QuizGenerator/premade_questions/cst463/math_and_data/matrix_questions.py,sha256=_oODuW4WMEVLuEJFmVjMWYTZn3RiE2MqlJSEIwRXNMo,28740
34
- QuizGenerator/premade_questions/cst463/math_and_data/vector_questions.py,sha256=nNu4Pqvy-zXO2Ly9UtqXIbx-gw2fUC40yii-PhuK-_c,12927
33
+ QuizGenerator/premade_questions/cst463/math_and_data/matrix_questions.py,sha256=4HsMflR1Fm-yjD0J3iW057_q3UHDRiW-swzOd5D73Ys,15647
34
+ QuizGenerator/premade_questions/cst463/math_and_data/vector_questions.py,sha256=VXQCLQEeNKxRDPn_fGW5nAPX-0betrZ8mURh0ElbNz0,12668
35
35
  QuizGenerator/premade_questions/cst463/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
- QuizGenerator/premade_questions/cst463/models/attention.py,sha256=i49u_bTbc_x0uLkmO-w7zQtLeoBpejVd78opVUnP9sg,5803
37
- QuizGenerator/premade_questions/cst463/models/cnns.py,sha256=yFqZJ-sKInGaFButUEuYiRRZkALqx8Tpv8I-fTfvQcU,6109
38
- QuizGenerator/premade_questions/cst463/models/matrices.py,sha256=H61_8cF1DGCt4Z4Ssoi4SMClf6tD5wHkOqY5bMdsSt4,699
39
- QuizGenerator/premade_questions/cst463/models/rnns.py,sha256=CXoXHMNIhJRD2MEZ0WNemTKQLQRV7ahTnGVRjOe77vU,6903
40
- QuizGenerator/premade_questions/cst463/models/text.py,sha256=vf9Lp9dvYs4Eok_ljt5MEw94O7YdhpP0JaDfDaPL0Vs,6705
41
- QuizGenerator/premade_questions/cst463/models/weight_counting.py,sha256=wz63jKluW3sFYOWUePgtcNQVpFJykyG3BxJzt0djrvY,7133
36
+ QuizGenerator/premade_questions/cst463/models/attention.py,sha256=iECxOoR0LEJAH_d7ZE3MoLOkdYVbGOKo4Dwf8Pww0tM,5443
37
+ QuizGenerator/premade_questions/cst463/models/cnns.py,sha256=_HSjgClNBBid5t52CDQfPUMdKOHFOXjy7VQ3sW-zW-Y,6030
38
+ QuizGenerator/premade_questions/cst463/models/matrices.py,sha256=21eNXUcIjFNZTGH18oH-x3MbCa4buNGQGer3a5yL85c,1938
39
+ QuizGenerator/premade_questions/cst463/models/rnns.py,sha256=5fKQuWnpSAoznZVJuCY4nICQ5KzB04Cz17hpccYiiVc,6673
40
+ QuizGenerator/premade_questions/cst463/models/text.py,sha256=BnW6qIB8pnQiFRyXxtX9cdsIfmjw99p6TI0WqI0AQzk,6605
41
+ QuizGenerator/premade_questions/cst463/models/weight_counting.py,sha256=sFnEvSs7ZwR4RZPltiMEElKJgoxHTaY427_g8Abi2uk,6912
42
42
  QuizGenerator/premade_questions/cst463/neural-network-basics/__init__.py,sha256=pmyCezO-20AFEQC6MR7KnAsaU9TcgZYsGQOMVkRZ-U8,149
43
- QuizGenerator/premade_questions/cst463/neural-network-basics/neural_network_questions.py,sha256=LTsUZqdP5zdG8VB10u5FYkQMm2Q1wvlaFAOOVQQesmg,45176
43
+ QuizGenerator/premade_questions/cst463/neural-network-basics/neural_network_questions.py,sha256=bit_HfAG4K6yh9SZZw_HAPhFUVFkOBdZ2odwt-Cdvmo,42868
44
44
  QuizGenerator/premade_questions/cst463/tensorflow-intro/__init__.py,sha256=G1gEHtG4KakYgi8ZXSYYhX6bQRtnm2tZVGx36d63Nmo,173
45
- QuizGenerator/premade_questions/cst463/tensorflow-intro/tensorflow_questions.py,sha256=KcYSDQQfbZcwNJQrBbcAmqIp69pYro8bJAWa1djDGsE,32263
46
- quizgenerator-0.7.0.dist-info/METADATA,sha256=BlnX3Luo-JjyqIyyduHlYlW5CAqnOpuDR2qVsDnc0fI,7212
47
- quizgenerator-0.7.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
48
- quizgenerator-0.7.0.dist-info/entry_points.txt,sha256=aOIdRdw26xY8HkxOoKHBnUPe2mwGv5Ti3U1zojb6zxQ,98
49
- quizgenerator-0.7.0.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
50
- quizgenerator-0.7.0.dist-info/RECORD,,
45
+ QuizGenerator/premade_questions/cst463/tensorflow-intro/tensorflow_questions.py,sha256=jZRbEqb65BAtliv_V9VR4kvpwOt-o10ApN7RmOIg3XI,30464
46
+ quizgenerator-0.8.0.dist-info/METADATA,sha256=W3Cb-jkrgfxtWGBJ7zynREY_q-_3q53rKpQ0eFC9OCw,8113
47
+ quizgenerator-0.8.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
48
+ quizgenerator-0.8.0.dist-info/entry_points.txt,sha256=aOIdRdw26xY8HkxOoKHBnUPe2mwGv5Ti3U1zojb6zxQ,98
49
+ quizgenerator-0.8.0.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
50
+ quizgenerator-0.8.0.dist-info/RECORD,,