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.
- QuizGenerator/contentast.py +6 -6
- QuizGenerator/generate.py +2 -1
- QuizGenerator/mixins.py +14 -100
- QuizGenerator/premade_questions/basic.py +24 -29
- QuizGenerator/premade_questions/cst334/languages.py +100 -99
- QuizGenerator/premade_questions/cst334/math_questions.py +112 -122
- QuizGenerator/premade_questions/cst334/memory_questions.py +621 -621
- QuizGenerator/premade_questions/cst334/persistence_questions.py +137 -163
- QuizGenerator/premade_questions/cst334/process.py +312 -322
- QuizGenerator/premade_questions/cst463/gradient_descent/gradient_calculation.py +34 -35
- QuizGenerator/premade_questions/cst463/gradient_descent/gradient_descent_questions.py +41 -36
- QuizGenerator/premade_questions/cst463/gradient_descent/loss_calculations.py +48 -41
- QuizGenerator/premade_questions/cst463/math_and_data/matrix_questions.py +285 -520
- QuizGenerator/premade_questions/cst463/math_and_data/vector_questions.py +149 -126
- QuizGenerator/premade_questions/cst463/models/attention.py +44 -50
- QuizGenerator/premade_questions/cst463/models/cnns.py +43 -47
- QuizGenerator/premade_questions/cst463/models/matrices.py +61 -11
- QuizGenerator/premade_questions/cst463/models/rnns.py +48 -50
- QuizGenerator/premade_questions/cst463/models/text.py +65 -67
- QuizGenerator/premade_questions/cst463/models/weight_counting.py +47 -46
- QuizGenerator/premade_questions/cst463/neural-network-basics/neural_network_questions.py +100 -156
- QuizGenerator/premade_questions/cst463/tensorflow-intro/tensorflow_questions.py +93 -141
- QuizGenerator/question.py +273 -202
- QuizGenerator/quiz.py +8 -5
- QuizGenerator/regenerate.py +128 -19
- {quizgenerator-0.7.0.dist-info → quizgenerator-0.8.0.dist-info}/METADATA +30 -2
- {quizgenerator-0.7.0.dist-info → quizgenerator-0.8.0.dist-info}/RECORD +30 -30
- {quizgenerator-0.7.0.dist-info → quizgenerator-0.8.0.dist-info}/WHEEL +0 -0
- {quizgenerator-0.7.0.dist-info → quizgenerator-0.8.0.dist-info}/entry_points.txt +0 -0
- {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
|
-
|
|
209
|
+
instance = question.instantiate(**kwargs)
|
|
210
210
|
|
|
211
211
|
# Get just the content body (without the #question wrapper which adds spacing)
|
|
212
|
-
typst_body =
|
|
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
|
-
|
|
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
|
-
|
|
455
|
+
instance = question.instantiate(rng_seed=question_seed, **kwargs)
|
|
456
|
+
question_ast = question._build_question_ast(instance)
|
|
455
457
|
else:
|
|
456
|
-
|
|
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
|
QuizGenerator/regenerate.py
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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'] =
|
|
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 =
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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.
|
|
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 =
|
|
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":
|
|
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(
|
|
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(
|
|
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.
|
|
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=
|
|
5
|
-
QuizGenerator/generate.py,sha256=
|
|
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=
|
|
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=
|
|
11
|
-
QuizGenerator/quiz.py,sha256=
|
|
12
|
-
QuizGenerator/regenerate.py,sha256=
|
|
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=
|
|
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=
|
|
21
|
-
QuizGenerator/premade_questions/cst334/math_questions.py,sha256=
|
|
22
|
-
QuizGenerator/premade_questions/cst334/memory_questions.py,sha256=
|
|
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=
|
|
25
|
-
QuizGenerator/premade_questions/cst334/process.py,sha256=
|
|
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=
|
|
29
|
-
QuizGenerator/premade_questions/cst463/gradient_descent/gradient_descent_questions.py,sha256=
|
|
30
|
-
QuizGenerator/premade_questions/cst463/gradient_descent/loss_calculations.py,sha256=
|
|
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=
|
|
34
|
-
QuizGenerator/premade_questions/cst463/math_and_data/vector_questions.py,sha256=
|
|
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=
|
|
37
|
-
QuizGenerator/premade_questions/cst463/models/cnns.py,sha256=
|
|
38
|
-
QuizGenerator/premade_questions/cst463/models/matrices.py,sha256=
|
|
39
|
-
QuizGenerator/premade_questions/cst463/models/rnns.py,sha256=
|
|
40
|
-
QuizGenerator/premade_questions/cst463/models/text.py,sha256=
|
|
41
|
-
QuizGenerator/premade_questions/cst463/models/weight_counting.py,sha256=
|
|
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=
|
|
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=
|
|
46
|
-
quizgenerator-0.
|
|
47
|
-
quizgenerator-0.
|
|
48
|
-
quizgenerator-0.
|
|
49
|
-
quizgenerator-0.
|
|
50
|
-
quizgenerator-0.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|