QuizGenerator 0.6.1__tar.gz → 0.6.3__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.
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/PKG-INFO +1 -1
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/canvas/canvas_interface.py +2 -1
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/contentast.py +69 -114
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/generate.py +21 -2
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/premade_questions/cst334/process.py +1 -1
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/pyproject.toml +1 -1
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/pyproject_prev.toml +1 -1
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/uv.lock +1 -1
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/.envrc +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/.gitignore +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/CODEOWNERS +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/LICENSE +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/__init__.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/__main__.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/canvas/__init__.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/canvas/classes.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/constants.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/misc.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/mixins.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/performance.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/premade_questions/__init__.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/premade_questions/basic.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/premade_questions/cst334/__init__.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/premade_questions/cst334/languages.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/premade_questions/cst334/math_questions.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/premade_questions/cst334/memory_questions.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/premade_questions/cst334/ostep13_vsfs.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/premade_questions/cst334/persistence_questions.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/premade_questions/cst463/__init__.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/premade_questions/cst463/gradient_descent/__init__.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/premade_questions/cst463/gradient_descent/gradient_calculation.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/premade_questions/cst463/gradient_descent/gradient_descent_questions.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/premade_questions/cst463/gradient_descent/loss_calculations.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/premade_questions/cst463/gradient_descent/misc.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/premade_questions/cst463/math_and_data/__init__.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/premade_questions/cst463/math_and_data/matrix_questions.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/premade_questions/cst463/math_and_data/vector_questions.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/premade_questions/cst463/models/__init__.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/premade_questions/cst463/models/attention.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/premade_questions/cst463/models/cnns.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/premade_questions/cst463/models/matrices.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/premade_questions/cst463/models/rnns.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/premade_questions/cst463/models/text.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/premade_questions/cst463/models/weight_counting.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/premade_questions/cst463/neural-network-basics/__init__.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/premade_questions/cst463/neural-network-basics/neural_network_questions.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/premade_questions/cst463/tensorflow-intro/__init__.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/premade_questions/cst463/tensorflow-intro/tensorflow_questions.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/qrcode_generator.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/question.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/quiz.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/regenerate.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/typst_utils.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/README.md +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/examples/web_ui_integration_example.py +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/scripts/generate_practice_yaml.sh +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/scripts/print.sh +0 -0
- {quizgenerator-0.6.1 → quizgenerator-0.6.3}/scripts/vendor_lms_interface.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: QuizGenerator
|
|
3
|
-
Version: 0.6.
|
|
3
|
+
Version: 0.6.3
|
|
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
|
|
@@ -154,7 +154,8 @@ class CanvasCourse(LMSWrapper):
|
|
|
154
154
|
# Get the question in a format that is ready for canvas (e.g. json)
|
|
155
155
|
# Use large gaps between base seeds to avoid overlap with backoff attempts
|
|
156
156
|
# Each variation gets seeds: base_seed, base_seed+1, base_seed+2, ... for backoffs
|
|
157
|
-
|
|
157
|
+
# Include question_i in the seed so different questions get different seed spaces
|
|
158
|
+
base_seed = (question_i * 100_000) + (attempt_number * 1000)
|
|
158
159
|
question_for_canvas = question.get__canvas(self.course, canvas_quiz, rng_seed=base_seed)
|
|
159
160
|
|
|
160
161
|
question_fingerprint = question_for_canvas["question_text"]
|
|
@@ -2315,61 +2315,53 @@ class ContentAST:
|
|
|
2315
2315
|
return fractions.Fraction(decimal.Decimal(str(x)))
|
|
2316
2316
|
|
|
2317
2317
|
@staticmethod
|
|
2318
|
-
def accepted_strings(
|
|
2319
|
-
|
|
2320
|
-
|
|
2321
|
-
|
|
2322
|
-
|
|
2323
|
-
|
|
2324
|
-
|
|
2325
|
-
|
|
2326
|
-
|
|
2327
|
-
|
|
2328
|
-
|
|
2329
|
-
|
|
2330
|
-
|
|
2318
|
+
def accepted_strings(value, max_denominator=720):
|
|
2319
|
+
"""
|
|
2320
|
+
Return a sorted list of acceptable answer strings for Canvas.
|
|
2321
|
+
|
|
2322
|
+
Generates:
|
|
2323
|
+
- Integer form (if value is a whole number)
|
|
2324
|
+
- Fixed decimal with DEFAULT_ROUNDING_DIGITS (e.g., "1.0000")
|
|
2325
|
+
- Trimmed decimal without trailing zeros (e.g., "1.25")
|
|
2326
|
+
- Simple fraction if exactly representable (e.g., "5/4")
|
|
2327
|
+
|
|
2328
|
+
Examples:
|
|
2329
|
+
1 → ["1", "1.0000"]
|
|
2330
|
+
1.25 → ["1.25", "1.2500", "5/4"]
|
|
2331
|
+
0.123444... → ["0.1234"]
|
|
2332
|
+
"""
|
|
2333
|
+
rounding_digits = ContentAST.Answer.DEFAULT_ROUNDING_DIGITS
|
|
2334
|
+
decimal.getcontext().prec = max(34, rounding_digits + 10)
|
|
2335
|
+
|
|
2331
2336
|
outs = set()
|
|
2332
2337
|
|
|
2333
|
-
#
|
|
2334
|
-
|
|
2335
|
-
|
|
2336
|
-
|
|
2337
|
-
|
|
2338
|
-
|
|
2339
|
-
|
|
2340
|
-
|
|
2341
|
-
#
|
|
2342
|
-
|
|
2343
|
-
|
|
2344
|
-
|
|
2345
|
-
|
|
2346
|
-
|
|
2347
|
-
|
|
2348
|
-
|
|
2349
|
-
|
|
2350
|
-
|
|
2351
|
-
|
|
2352
|
-
|
|
2353
|
-
|
|
2354
|
-
|
|
2355
|
-
|
|
2356
|
-
|
|
2357
|
-
|
|
2358
|
-
|
|
2359
|
-
|
|
2360
|
-
d = (decimal.Decimal(f.numerator) / decimal.Decimal(f.denominator)).quantize(q, rounding=decimal.ROUND_HALF_UP)
|
|
2361
|
-
outs.add(format(d, 'f'))
|
|
2362
|
-
|
|
2363
|
-
# Trimmed decimal
|
|
2364
|
-
if ContentAST.Answer.DEFAULT_ROUNDING_DIGITS:
|
|
2365
|
-
q = decimal.Decimal(1).scaleb(-ContentAST.Answer.DEFAULT_ROUNDING_DIGITS)
|
|
2366
|
-
d = (decimal.Decimal(f.numerator) / decimal.Decimal(f.denominator)).quantize(q, rounding=decimal.ROUND_HALF_UP)
|
|
2367
|
-
s = format(d, 'f').rstrip('0').rstrip('.')
|
|
2368
|
-
if s.startswith('.'):
|
|
2369
|
-
s = '0' + s
|
|
2370
|
-
if s == '-0':
|
|
2371
|
-
s = '0'
|
|
2372
|
-
outs.add(s)
|
|
2338
|
+
# Round to our standard precision first
|
|
2339
|
+
q = decimal.Decimal(1).scaleb(-rounding_digits)
|
|
2340
|
+
rounded_decimal = decimal.Decimal(str(value)).quantize(q, rounding=decimal.ROUND_HALF_UP)
|
|
2341
|
+
|
|
2342
|
+
# Normalize negative zero to positive zero
|
|
2343
|
+
if rounded_decimal == 0:
|
|
2344
|
+
rounded_decimal = abs(rounded_decimal)
|
|
2345
|
+
|
|
2346
|
+
# Fixed decimal form (e.g., "1.2500")
|
|
2347
|
+
fixed_str = format(rounded_decimal, 'f')
|
|
2348
|
+
outs.add(fixed_str)
|
|
2349
|
+
|
|
2350
|
+
# Trimmed decimal form (e.g., "1.25")
|
|
2351
|
+
trimmed_str = fixed_str.rstrip('0').rstrip('.')
|
|
2352
|
+
if trimmed_str.startswith('.'):
|
|
2353
|
+
trimmed_str = '0' + trimmed_str
|
|
2354
|
+
outs.add(trimmed_str)
|
|
2355
|
+
|
|
2356
|
+
# Integer form (if it's a whole number after rounding)
|
|
2357
|
+
if rounded_decimal == rounded_decimal.to_integral_value():
|
|
2358
|
+
outs.add(str(int(rounded_decimal)))
|
|
2359
|
+
|
|
2360
|
+
# Fraction form (only if exactly representable with reasonable denominator)
|
|
2361
|
+
f = ContentAST.Answer._to_fraction(rounded_decimal)
|
|
2362
|
+
fr = f.limit_denominator(max_denominator)
|
|
2363
|
+
if fr == f and fr.denominator > 1:
|
|
2364
|
+
outs.add(f"{fr.numerator}/{fr.denominator}")
|
|
2373
2365
|
|
|
2374
2366
|
return sorted(outs, key=lambda s: (len(s), s))
|
|
2375
2367
|
|
|
@@ -2378,6 +2370,10 @@ class ContentAST:
|
|
|
2378
2370
|
"""Fix -0.0 display issue."""
|
|
2379
2371
|
return 0.0 if x == 0 else x
|
|
2380
2372
|
|
|
2373
|
+
@staticmethod
|
|
2374
|
+
def get_spacing_variations_of_list(l, remove_space=False):
|
|
2375
|
+
return [', '.join(l)] + ([', '.join(l)] if remove_space else [])
|
|
2376
|
+
|
|
2381
2377
|
|
|
2382
2378
|
class AnswerTypes:
|
|
2383
2379
|
# Multibase answers that can accept either hex, binary or decimal
|
|
@@ -2451,12 +2447,7 @@ class AnswerTypes:
|
|
|
2451
2447
|
# Use the accepted_strings helper
|
|
2452
2448
|
answer_strings = ContentAST.Answer.accepted_strings(
|
|
2453
2449
|
self.value,
|
|
2454
|
-
|
|
2455
|
-
allow_simple_fraction=True,
|
|
2456
|
-
max_denominator=60,
|
|
2457
|
-
allow_mixed=True,
|
|
2458
|
-
include_spaces=False,
|
|
2459
|
-
include_fixed_even_if_integer=True
|
|
2450
|
+
max_denominator=60
|
|
2460
2451
|
)
|
|
2461
2452
|
|
|
2462
2453
|
canvas_answers = [
|
|
@@ -2505,37 +2496,23 @@ class AnswerTypes:
|
|
|
2505
2496
|
canvas_answers = [
|
|
2506
2497
|
{
|
|
2507
2498
|
"blank_id": self.key,
|
|
2508
|
-
"answer_text":
|
|
2509
|
-
"answer_weight": 100 if self.correct else 0,
|
|
2510
|
-
},
|
|
2511
|
-
{
|
|
2512
|
-
"blank_id": self.key,
|
|
2513
|
-
"answer_text": ','.join(map(str, self.value)),
|
|
2499
|
+
"answer_text": spacing_variation,
|
|
2514
2500
|
"answer_weight": 100 if self.correct else 0,
|
|
2515
2501
|
}
|
|
2502
|
+
for spacing_variation in self.get_spacing_variations_of_list(map(str, self.value))
|
|
2516
2503
|
]
|
|
2517
2504
|
else:
|
|
2518
2505
|
canvas_answers = []
|
|
2519
|
-
|
|
2520
|
-
# With spaces
|
|
2521
|
-
canvas_answers.extend([
|
|
2506
|
+
canvas_answers = [
|
|
2522
2507
|
{
|
|
2523
2508
|
"blank_id": self.key,
|
|
2524
|
-
"answer_text":
|
|
2509
|
+
"answer_text": spacing_variation,
|
|
2525
2510
|
"answer_weight": 100 if self.correct else 0,
|
|
2526
2511
|
}
|
|
2527
2512
|
for possible_state in itertools.permutations(self.value)
|
|
2528
|
-
|
|
2513
|
+
for spacing_variation in self.get_spacing_variations_of_list(possible_state)
|
|
2514
|
+
]
|
|
2529
2515
|
|
|
2530
|
-
# Without spaces
|
|
2531
|
-
canvas_answers.extend([
|
|
2532
|
-
{
|
|
2533
|
-
"blank_id": self.key,
|
|
2534
|
-
"answer_text": ','.join(map(str, possible_state)),
|
|
2535
|
-
"answer_weight": 100 if self.correct else 0,
|
|
2536
|
-
}
|
|
2537
|
-
for possible_state in itertools.permutations(self.value)
|
|
2538
|
-
])
|
|
2539
2516
|
return canvas_answers
|
|
2540
2517
|
|
|
2541
2518
|
def get_display_string(self) -> str:
|
|
@@ -2558,41 +2535,19 @@ class AnswerTypes:
|
|
|
2558
2535
|
|
|
2559
2536
|
canvas_answers = []
|
|
2560
2537
|
for combination in itertools.product(*answer_variations):
|
|
2561
|
-
|
|
2562
|
-
|
|
2563
|
-
|
|
2564
|
-
|
|
2565
|
-
|
|
2566
|
-
|
|
2567
|
-
|
|
2568
|
-
|
|
2569
|
-
|
|
2570
|
-
|
|
2571
|
-
|
|
2572
|
-
|
|
2573
|
-
|
|
2574
|
-
{
|
|
2575
|
-
"blank_id": self.key,
|
|
2576
|
-
"answer_weight": 100 if self.correct else 0,
|
|
2577
|
-
"answer_text": f"({', '.join(list(combination))})",
|
|
2578
|
-
},
|
|
2579
|
-
{
|
|
2580
|
-
"blank_id": self.key,
|
|
2581
|
-
"answer_weight": 100 if self.correct else 0,
|
|
2582
|
-
"answer_text": f"({','.join(list(combination))})",
|
|
2583
|
-
},
|
|
2584
|
-
# Add square brackets
|
|
2585
|
-
{
|
|
2586
|
-
"blank_id": self.key,
|
|
2587
|
-
"answer_weight": 100 if self.correct else 0,
|
|
2588
|
-
"answer_text": f"[{', '.join(list(combination))}]",
|
|
2589
|
-
},
|
|
2590
|
-
{
|
|
2591
|
-
"blank_id": self.key,
|
|
2592
|
-
"answer_weight": 100 if self.correct else 0,
|
|
2593
|
-
"answer_text": f"[{','.join(list(combination))}]",
|
|
2594
|
-
}
|
|
2595
|
-
])
|
|
2538
|
+
for spacing_variation in self.get_spacing_variations_of_list(list(combination)):
|
|
2539
|
+
canvas_answers.extend([
|
|
2540
|
+
{
|
|
2541
|
+
"blank_id": self.key,
|
|
2542
|
+
"answer_weight": 100 if self.correct else 0,
|
|
2543
|
+
"answer_text": f"{spacing_variation}",
|
|
2544
|
+
}, # without parenthesis
|
|
2545
|
+
{
|
|
2546
|
+
"blank_id": self.key,
|
|
2547
|
+
"answer_weight": 100 if self.correct else 0,
|
|
2548
|
+
"answer_text": f"({spacing_variation})",
|
|
2549
|
+
} # with parenthesis
|
|
2550
|
+
])
|
|
2596
2551
|
return canvas_answers
|
|
2597
2552
|
|
|
2598
2553
|
def get_display_string(self) -> str:
|
|
@@ -50,6 +50,8 @@ def parse_args():
|
|
|
50
50
|
# Testing flags
|
|
51
51
|
parser.add_argument("--test_all", type=int, default=0, metavar="N",
|
|
52
52
|
help="Generate N variations of ALL registered questions to test they work correctly")
|
|
53
|
+
parser.add_argument("--test_questions", nargs='+', metavar="NAME",
|
|
54
|
+
help="Only test specific question types by name (use with --test_all)")
|
|
53
55
|
parser.add_argument("--strict", action="store_true",
|
|
54
56
|
help="With --test_all, skip PDF/Canvas generation if any questions fail")
|
|
55
57
|
|
|
@@ -79,7 +81,8 @@ def test_all_questions(
|
|
|
79
81
|
generate_pdf: bool = False,
|
|
80
82
|
use_typst: bool = True,
|
|
81
83
|
canvas_course=None,
|
|
82
|
-
strict: bool = False
|
|
84
|
+
strict: bool = False,
|
|
85
|
+
question_filter: list = None
|
|
83
86
|
):
|
|
84
87
|
"""
|
|
85
88
|
Test all registered questions by generating N variations of each.
|
|
@@ -93,11 +96,26 @@ def test_all_questions(
|
|
|
93
96
|
use_typst: If True, use Typst for PDF generation; otherwise use LaTeX
|
|
94
97
|
canvas_course: If provided, push a test quiz to this Canvas course
|
|
95
98
|
strict: If True, skip PDF/Canvas generation if any questions fail
|
|
99
|
+
question_filter: If provided, only test questions whose names contain one of these strings (case-insensitive)
|
|
96
100
|
"""
|
|
97
101
|
# Ensure all premade questions are loaded
|
|
98
102
|
QuestionRegistry.load_premade_questions()
|
|
99
103
|
|
|
100
104
|
registered_questions = QuestionRegistry._registry
|
|
105
|
+
|
|
106
|
+
# Filter questions if a filter list is provided
|
|
107
|
+
if question_filter:
|
|
108
|
+
filter_lower = [f.lower() for f in question_filter]
|
|
109
|
+
registered_questions = {
|
|
110
|
+
name: cls for name, cls in registered_questions.items()
|
|
111
|
+
if any(f in name.lower() for f in filter_lower)
|
|
112
|
+
}
|
|
113
|
+
if not registered_questions:
|
|
114
|
+
print(f"No questions matched filter: {question_filter}")
|
|
115
|
+
print(f"Available questions: {sorted(QuestionRegistry._registry.keys())}")
|
|
116
|
+
return False
|
|
117
|
+
print(f"Filtered to {len(registered_questions)} questions matching: {question_filter}")
|
|
118
|
+
|
|
101
119
|
total_questions = len(registered_questions)
|
|
102
120
|
|
|
103
121
|
# Test defaults for questions that require external input
|
|
@@ -437,7 +455,8 @@ def main():
|
|
|
437
455
|
generate_pdf=True,
|
|
438
456
|
use_typst=getattr(args, 'typst', True),
|
|
439
457
|
canvas_course=canvas_course,
|
|
440
|
-
strict=args.strict
|
|
458
|
+
strict=args.strict,
|
|
459
|
+
question_filter=args.test_questions
|
|
441
460
|
)
|
|
442
461
|
exit(0 if success else 1)
|
|
443
462
|
|
{quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/premade_questions/cst334/process.py
RENAMED
|
@@ -324,7 +324,7 @@ class SchedulingQuestion(ProcessQuestion, RegenerableChoiceMixin, TableQuestionM
|
|
|
324
324
|
jobs_to_run=jobs,
|
|
325
325
|
selector=(lambda j, curr_time: (j.last_run, j.job_id)),
|
|
326
326
|
preemptable=True,
|
|
327
|
-
time_quantum=1e-
|
|
327
|
+
time_quantum=1e-05
|
|
328
328
|
)
|
|
329
329
|
case _:
|
|
330
330
|
self.run_simulation(
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/premade_questions/cst334/__init__.py
RENAMED
|
File without changes
|
{quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/premade_questions/cst334/languages.py
RENAMED
|
File without changes
|
{quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/premade_questions/cst334/math_questions.py
RENAMED
|
File without changes
|
|
File without changes
|
{quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/premade_questions/cst334/ostep13_vsfs.py
RENAMED
|
File without changes
|
|
File without changes
|
{quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/premade_questions/cst463/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/premade_questions/cst463/models/cnns.py
RENAMED
|
File without changes
|
|
File without changes
|
{quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/premade_questions/cst463/models/rnns.py
RENAMED
|
File without changes
|
{quizgenerator-0.6.1 → quizgenerator-0.6.3}/QuizGenerator/premade_questions/cst463/models/text.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|