التعليقات التوضيحية العلائقية

مكتمل

النوع الأساسي من التعليقات التوضيحية في PyBryt هو تعليق القيمة، والذي يؤكد وجود بعض القيمة في بصمة ذاكرة الطالب. ومع ذلك، لا تغطي هذه التعليقات التوضيحية جميع الحالات؛ ماذا لو كنت تريد التحقق من وجود تمثيلين محتملين لقيمة ما، أو إذا كنت تريد فحص ترتيب القيم؟ هذا هو المكان الذي تأتي فيه التعليقات التوضيحية العلائقية.

تحدد التعليقات التوضيحية العلائقية نوعًا من العلاقة بين التعليقات التوضيحية الأخرى. يمكنك التفكير في التعليقات التوضيحية العلائقية كتعليقات توضيحية تعمل على تعليقات توضيحية أخرى، مع التأكيد على الشروط المتعلقة بكيفية استيفاء هذه التعليقات التوضيحية. في الوحدة الأخيرة، تعرفت على تعليقات المجموعة التوضيحية، وكيف يمكن استخدامها لفرض ترتيب التعليقات التوضيحية. التعليقات التوضيحية العلائقية متشابهة، وفي الواقع يمكن اعتبار المجموعات كنوع من التعليقات العلائقية.

حاليًا، يدعم PyBryt نوعين من التعليقات التوضيحية: التعليقات التوضيحية المؤقتة والتعليقات التوضيحية المنطقية.

التعليقات التوضيحية الزمنية

تصف التعليقات التوضيحية الزمنية العلاقة الزمنية بين التعليقات التوضيحية المختلفة. وتكون مستوفاة يتم استيفاء جميع التعليقات التوضيحية التابعة لها، وتحدث الطوابع الزمنية للقيم التي تفي بهذه التعليقات التوضيحية بترتيب معين.

يوجد في PyBryt نوع واحد فقط من التعليقات التوضيحية المؤقتة، وهو BeforeAnnotation، والتي تؤكد أن الطوابع الزمنية المُرضية للتعليقات التوضيحية التابعة لها تحدث بترتيب غير تنازلي. يمكن إنشاء مثيل لهذه التعليقات التوضيحية مباشرةً باستخدام الدالة الإنشائية، مثل أي تعليقات توضيحية أخرى، ولكن تحتوي جميع التعليقات التوضيحية أيضًا على أسلوب before وafter اللذين يمكن استخدامهما لإنشاء هذه التعليقات التوضيحية بطريقة أكثر دلالية:

>>> a1 = pybryt.Value(1)
>>> a2 = pybryt.Value(2)
>>> a1.before(a2), a1.after(a2)
(pybryt.BeforeAnnotation, pybryt.BeforeAnnotation)

كما ترون، كل من Annotation.before وAnnotation.after يرجع عددًا من BeforeAnnotation، ولكن يتم عكس ترتيب التعليقات التوضيحية في التعليق التوضيحي التي تم إرجاعها من قبل after.

عند إنشاء تعليق توضيحي علائقي، يمكنك تحديث الحقول لكل خيار من خيارات التعليق التوضيحي حسب الحاجة، أو تمرير الخيارات كوسيطات كلمات أساسية للأسلوب before أو after:

a1_before_a2 = a1.before(
    a2,
    success_message="a1 is before a2",
    failure_message="a1 is not before a2",
)

# or:
a1_before_a2 = a1.before(a2)
a1_before_a2.success_message = "a1 is before a2"
a1_before_a2.failure_message = "a1 is not before a2"

باستخدام بصمة الذاكرة الوهمية، يمكننا أن نرى مدى استيفاء BeforeAnnotation. في الخلية أدناه، نقوم بإنشاء مثل هذه البصمة باستخدام الأسلوب pybryt.MemoryFootprint.from_values الذي يقبل القيم والطوابع الزمنية البديلة:

pybryt.MemoryFootprint.from_values(val1, ts1, val2, ts2, val3, ts3, ...)

لاحظ كيف تتغير نتيجة التعليق التوضيحي العلائقي عندما نغير القيم في البصمة والطوابع الزمنية الخاصة بها.

>>> ref = pybryt.ReferenceImplementation("temporal-annotations", [a1_before_a2])
>>> # the values in the correct order
>>> res = ref.run(pybryt.MemoryFootprint.from_values(1, 1, 2, 2))
>>> print(pybryt.generate_report(res))
REFERENCE: temporal-annotations
SATISFIED: True
MESSAGES:
  - a1 is before a2
>>> # put both values at the same timestamp
>>> res = ref.run(pybryt.MemoryFootprint.from_values(1, 1, 2, 1))
>>> print(pybryt.generate_report(res))
REFERENCE: temporal-annotations
SATISFIED: True
MESSAGES:
  - a1 is before a2
>>> # put the timestamp of 1 after the timestamp of 2
>>> res = ref.run(pybryt.MemoryFootprint.from_values(1, 2, 2, 1))
>>> print(pybryt.generate_report(res))
REFERENCE: temporal-annotations
SATISFIED: False
MESSAGES:
  - a1 is not before a2
>>> # don't satisfy the second annotation
>>> res = ref.run(pybryt.MemoryFootprint.from_values(1, 1))
>>> print(pybryt.generate_report(res))
REFERENCE: temporal-annotations
SATISFIED: False
MESSAGES:
  - a1 is not before a2

التعليقات التوضيحية المنطقية

لا تهتم التعليقات التوضيحية المنطقية بالوقت الذي تتم فيه تلبية التعليقات التوضيحية، ولكنها تعمل بدلاً من ذلك على ما إذا كانت التعليقات التوضيحية مستوفاة على الإطلاق. وتؤكد على شروط على ما إذا كانت التعليقات التوضيحية الفرعية مستوفاة أم لا، مما يسمح لك بإنشاء قيمة منطقية معقدة ضمن المراجع المتوفرة لديك للسماح بمسارات متعددة تصل إلى نفس الحل.

لإنشاء تعليق توضيحي منطقي، استخدم عوامل التشغيل المنطقية ثنائية البت في Python في أي تعليق توضيحي:

>>> a1 & a2, a1 | a2, a1 ^ a2
(pybryt.AndAnnotation, pybryt.OrAnnotation, pybryt.XorAnnotation)

لإنشاء شروط تتضمن أكثر من تعليقين توضيحيين فقط، يمكنك تقييد عوامل التشغيل أو إنشاء مثيل للتعليقات التوضيحية مباشرة مع التعليقات التوضيحية التابعة. على غرار التعليقات التوضيحية الزمنية، يمكن تعيين خيارات التعليقات التوضيحية المنطقية عن طريق تحديث السمة المقابلة على عنصر التعليق التوضيحي.

a3 = pybryt.Value(3)

all_anns = a1 & a2 & a3
all_anns.success_message = "Found a1, a2, and a3"
all_anns.failure_message = "Did not find a1, a2, and a3"

any_anns = a1 | a2 | a3
any_anns.success_message = "Found a1, a2, or a3"
any_anns.failure_message = "Did not find a1, a2, or a3"

one_ann = a1 ^ a2 ^ a3
one_ann.success_message = "Found exactly of a1, a2, or a3"
one_ann.failure_message = "Did not find exactly one of a1, a2, or a3"

يدعم PyBryt أيضًا عامل التشغيل غير (~)، لإنتاج التعليقات التوضيحية التي تستوفى فقط إذا لم يتم استيفاء التعليقات التوضيحية التابعة لها. على سبيل المثال، يمكن استخدامها لإرسال رسالة إلى الطلاب إذا كانت هناك قيمة معينة في بصمة الذاكرة الخاصة بهم والتي لا ينبغي أن تكون موجودة:

not_lst = ~pybryt.Value(lst)
not_lst.failure_message = "Found an incorrect value in your submission; " + \
    "please double-check your implementation."

يوفر التعليق التوضيحي أعلاه رسالة للطلاب إذا وجد قيمة lst في بصمة الذاكرة. (لاحظ أنه يمكن تحقيق نفس التأثير عن طريق تعيين success_message في الدالة الإنشائية pybryt.Value.)

اختبر معلوماتك

1.

ما هو التعبير أدناه الذي ينشئ تعليقًا توضيحيًا يؤكد أن أيًا من a1 أو a2 تم استيفاؤه؟

2.

أي من الاستدعاءات التالية ينشئ تعليقاً توضيحياً يؤكد أن v2 يأتي بشكل صارم بعدv1 (أي، الطوابع الزمنية لـ v1 وv2 لا يمكن أن تكون متطابقة)؟

3.

لنفترض أننا ننشئ تعليقًا توضيحيًا يسمى ann باستخدام:

a1, a2, a3 = pybryt.Value(1), pybryt.Value(2), pybryt.Value(3)
ann = (a1 | a2) ^ a3

أي من المجموعات التالية، إذا تحولت إلى بصمة الذاكرة، من شأنها أن تستوفي ann؟