Interpreter

שיעור סיום ציבורי תרגום שיחה פעילה

שיעור הנהג להסקת מסקנות מהמודל באמצעות TensorFlow Lite.

הערה: אם אינך זקוק לגישה לאף אחת מהאפשרויות ה"ניסיוניות" תכונות ה-API שמפורטות בהמשך, מעדיפים להשתמש בהן במקום להשתמש ב-TranslateerApi וב-TranslateerFact , במקום להשתמש ישירות ב'תרגום שיחה פעילה'.

Interpreter כולל מודל TensorFlow Lite שעבר אימון מקדים, שבו פעולות מופעלות לצורך הסקת מסקנות מהמודל.

לדוגמה, אם המודל מקבל רק קלט אחד ומחזיר רק פלט אחד:

try (Interpreter interpreter = new Interpreter(file_of_a_tensorflowlite_model)) {
   interpreter.run(input, output);
 }
 

אם המודל מקבל כמה קלטים או פלטים:

Object[] inputs = {input0, input1, ...};
 Map<Integer, Object> map_of_indices_to_outputs = new HashMap<>();
 FloatBuffer ith_output = FloatBuffer.allocateDirect(3 * 2 * 4);  // Float tensor, shape 3x2x4.
 ith_output.order(ByteOrder.nativeOrder());
 map_of_indices_to_outputs.put(i, ith_output);
 try (Interpreter interpreter = new Interpreter(file_of_a_tensorflowlite_model)) {
   interpreter.runForMultipleInputsOutputs(inputs, map_of_indices_to_outputs);
 }
 

אם המודל לוקח או מפיק מעבדי מחרוזות:

String[] input = {"foo", "bar"};  // Input tensor shape is [2].
 String[][] output = new String[3][2];  // Output tensor shape is [3, 2].
 try (Interpreter interpreter = new Interpreter(file_of_a_tensorflowlite_model)) {
   interpreter.runForMultipleInputsOutputs(input, output);
 }
 

שימו לב שיש הבחנה בין צורה [] לצורה[1]. לטנזין של מחרוזת סקלרית פלט:

String[] input = {"foo"};  // Input tensor shape is [1].
 ByteBuffer outputBuffer = ByteBuffer.allocate(OUTPUT_BYTES_SIZE);  // Output tensor shape is [].
 try (Interpreter interpreter = new Interpreter(file_of_a_tensorflowlite_model)) {
   interpreter.runForMultipleInputsOutputs(input, outputBuffer);
 }
 byte[] outputBytes = new byte[outputBuffer.remaining()];
 outputBuffer.get(outputBytes);
 // Below, the `charset` can be StandardCharsets.UTF_8.
 String output = new String(outputBytes, charset);
 

הסדר של נתוני הקלט והפלט נקבעים בהמרה של מודל TensorFlow ל-TensorFlowLite ב-Toco, וכך גם צורות ברירת המחדל של הקלט.

כאשר ערכי הקלט מוצגים כמערכים (רב-מימדיים), רכיבי הקלט המתאימים לשנות את גודלן במרומז בהתאם לצורת המערך. כשמזינים ערכי קלט בתור Buffer ללא שינוי גודל מרומז, המתקשר חייב לוודא שגודל הבייטים של Buffer תואם לזה של הטנזור התואם, או שקודם הוא משנה את הגודל של הטנזור דרך resizeInput(int, int[]). מידע על הצורה והסוגים של Tensor אפשר לקבל דרך המחלקה Tensor, שזמינה דרך getInputTensor(int) ו-getOutputTensor(int).

אזהרה: מכונות Interpreter לא בטוחות לשרשורים. Interpreter הוא הבעלים של משאבים שחייבים לפנות במפורש על ידי הפעלה של close()

ספריית TFLite מבוססת על NDK API 19. יכול להיות שהתכונה תפעל גם ברמות API של Android מתחת ל-19, אבל הדבר לא מובטח.

מחלקות מקוננות

מחלקה Interpreter.Options סיווג אפשרויות לשליטה בהתנהגות של המתורגמן בסביבת זמן הריצה.

בנייה ציבורית

תרגום(קובץ modelFile)
מתבצע אתחול של Interpreter.
תרגום(קובץ modelFile, אפשרויות של Interpreter.Options)
מופעלת Interpreter ומציינת אפשרויות להתאמה אישית של התנהגות המתורגמן.
תרגום(ByteBuffer byteBuffer)
מאתחלת Interpreter עם ByteBuffer של קובץ מודל.
תרגום שיחה פעילה(ByteBuffer byteBuffer, Interpreter.Options)
הפעלת Interpreter עם ByteBuffer של קובץ מודל וקבוצה של Interpreter.Options בהתאמה אישית.

שיטות ציבוריות

ריק
allocateTensors()
מעדכן באופן מפורש את ההקצאות לכל הפרמטרים של Tensor, אם יש צורך.
ריק
Close()
שחרור משאבים שמשויכים למכונה InterpreterApi.
int
getInputIndex(String opName)
מקבל אינדקס של קלט בהינתן שם הפעולה של הקלט.
Tensor
getInputTensor(int inputIndex)
הפונקציה מקבלת את ה-Tensor שמשויך לאינדקס הקלט שסופק.
int
getInputTensorCount()
הפונקציה מקבלת את מספר Tensors הקלט.
Tensor
getInputTensorFromSignature(StringinputName, StringSignatureKey)
הפונקציה מקבלת את ה-Tensor שמשויך לשם הקלט ולשם שיטת החתימה שסופקו.
ארוכה
getLastNativeInferenceDurationNanoseconds()
הפונקציה מחזירה את תזמון ההסקה המקורי.
int
getOutputIndex(opName String)
מקבל אינדקס של פלט בהינתן שם הפעולה של הפלט.
Tensor
getOutputTensor(int outputIndex)
הפונקציה מקבלת את ה-Tensor שמשויך לאינדקס הפלט שסופק.
int
getOutputTensorCount()
הפונקציה מקבלת את מספר Tensors הפלט.
Tensor
getOutputTensorFromSignature(StringoutputName, StringSignatureKey)
הפונקציה מקבלת את ה-Tensor שמשויך לשם הפלט שסופק ב-method של חתימה ספציפית.
String[]
getSignatureInputs(StringSignatureKey)
הפונקציה מקבלת את רשימת ערכי הקלט של SignatureDefs ל-method signatureKey.
String[]
getSignatureKeys()
מקבלת את רשימת שמות השיטות שיוצאו באמצעות SignatureDef וזמינים במודל.
String[]
getSignatureOutputs(StringSignatureKey)
קבלת רשימת הפלט של SignatureDefs ל-method signatureKey.
ריק
resetVariableTensors()
מתקדם: איפוס כל הפרמטרים של המשתנים לערך ברירת המחדל.
ריק
resizeInput(int idx, int[] dims, boolean strict)
משנה את גודל הקלט מסוג idx-th של המודל המקורי לעמימות הנתונים הנתונים.
ריק
resizeInput(int idx, int[] מעומעם)
משנה את גודל הקלט מסוג idx-th של המודל המקורי לעמימות הנתונים הנתונים.
ריק
run(קלט של אובייקט, פלט אובייקט)
מפעילה את מסקנות המודל אם המודל מקבל רק קלט אחד ומספק רק פלט אחד.
ריק
runForMultipleInputsOutputs(אובייקט[] קלט, פלט מפה<Integerאובייקט>)
מפעילה את ההֶקֵּשׁ של המודל אם המודל מקבל כמה קלטים, או מחזיר כמה פלטים.
ריק
runSignature(מפה<מחרוזתאובייקט> קלט, מפה<מחרוזתאובייקט> פלטים)
זהה ל-runSignature(Map, Map, String), אבל לא מחייב העברה של SignatureKey, בהנחה שלמודל יש SignatureDef אחד.
ריק
runSignature(מפה<מחרוזתאובייקט> קלט, מפה<מחרוזתאובייקט> פלטים, מחרוזתמפתח חתימה)
מפעילה את מסקנות המודל על סמך SignatureDef שסופק דרך signatureKey.
ריק
setCancelled(בוליאני בוטל)
מתקדם: הפרעה להסקת המסקנות באמצע השיחה אל run(Object, Object).

שיטות שעברו בירושה

בנייה ציבורית

ציבורי תרגום שיחה (קובץ modelFile)

מתבצע אתחול של Interpreter.

פרמטרים
modelFile קובץ של מודל TF Lite שעבר אימון מראש.
קליעות
IllegalArgumentException אם modelFile לא מקודד רכיב TensorFlow Lite תקין מודל טרנספורמר.

ציבורי תרגום שיחה (קובץ modelFile, אפשרויות Interpreter.Options)

מופעלת Interpreter ומציינת אפשרויות להתאמה אישית של התנהגות המתורגמן.

פרמטרים
modelFile קובץ של מודל TF Lite שעבר אימון מקדים
אפשרויות קבוצת אפשרויות להתאמה אישית של התנהגות המתורגמים
קליעות
IllegalArgumentException אם modelFile לא מקודד רכיב TensorFlow Lite תקין מודל טרנספורמר.

ציבורי תרגום שיחה (ByteBuffer byteBuffer)

מאתחלת Interpreter עם ByteBuffer של קובץ מודל.

אין לשנות את ה-ByteBuffer אחרי בניית Interpreter. ByteBuffer יכול להיות MappedByteBuffer שמשמש למיפוי זיכרון של קובץ מודל, או ערך ByteBuffer ישיר של NativeOrder() שמכיל את תוכן הבייטים של המודל.

פרמטרים
byteBuffer
קליעות
IllegalArgumentException אם byteBuffer הוא לא MappedByteBuffer או ישירות ByteBuffer מ-NativeOrder.

ציבורי תרגום שיחה (ByteBuffer byteBuffer, Interpreter.Options אפשרויות)

הפעלת Interpreter עם ByteBuffer של קובץ מודל וקבוצה של Interpreter.Options בהתאמה אישית.

אין לשנות את ByteBuffer לאחר היצירה של Interpreter. ByteBuffer יכול להיות MappedByteBuffer שממפה את הזיכרון קובץ מודל או ByteBuffer ישיר של NativeOrder() שמכיל את תוכן הבייטים של דגם מסוים.

פרמטרים
byteBuffer
אפשרויות
קליעות
IllegalArgumentException אם byteBuffer הוא לא MappedByteBuffer או ישירות ByteBuffer מ-NativeOrder.

שיטות ציבוריות

ציבורי ריק allocateTensors ()

מעדכן באופן מפורש את ההקצאות לכל הפרמטרים של Tensor, אם יש צורך.

הפעולה הזו תפיץ צורות והקצאות זיכרון של מעבדי tensors תלויים באמצעות הקלט את צורות ה-tensor, בהתאם למה שניתנו.

הערה: השיחה הזו *אופציונלית לחלוטין*. הקצאת Tensor תתבצע באופן אוטומטי במהלך אם בוצע שינוי של הגודל של מעבדי קלט. קריאה זו שימושית במיוחד בקביעת צורות עבור גורמי פלט פלט לפני הרצת התרשים, למשל,

 interpreter.resizeInput(0, new int[]{1, 4, 4, 3}));
 interpreter.allocateTensors();
 FloatBuffer input = FloatBuffer.allocate(interpreter.getInputTensor(0).numElements());
 // Populate inputs...
 FloatBuffer output = FloatBuffer.allocate(interpreter.getOutputTensor(0).numElements());
 interpreter.run(input, output)
 // Process outputs...

הערה: לחלק מהתרשימים יש פלטים בעיצוב דינמי, במקרה כזה יכול להיות שצורת הפלט לא תעוצב באופן דינמי. להפצה מלאה עד שהסקת מסקנות מתבצעת.

ציבורי ריק סגירה ()

שחרור משאבים שמשויכים למכונה InterpreterApi.

ציבורי INT getInputIndex (מחרוזת opName)

מקבל אינדקס של קלט בהינתן שם הפעולה של הקלט.

פרמטרים
opName

ציבורי Tensor getInputTensor (int קלט Index)

הפונקציה מקבלת את ה-Tensor שמשויך לאינדקס הקלט שסופק.

פרמטרים
inputIndex

ציבורי INT getInputTensorCount ()

הפונקציה מקבלת את מספר Tensors הקלט.

ציבורי Tensor getInputTensorFromSignature (מחרוזתinputName, מחרוזתSignatureKey)

הפונקציה מקבלת את ה-Tensor שמשויך לשם הקלט ולשם שיטת החתימה שסופקו.

אזהרה: זהו API ניסיוני והוא עשוי להשתנות.

פרמטרים
inputName הזנת שם בחתימה.
signatureKey מפתח חתימה המזהה את ה-SignatureDef יכול להיות null אם המודל כולל חתימה אחת.
קליעות
IllegalArgumentException אם הערך של inputName או של signatureKey הוא null או ריק, או שם לא חוקי

ציבורי ארוכה getLastNativeInferenceDurationNanoseconds ()

הפונקציה מחזירה את תזמון ההסקה המקורי.

ציבורי INT getOutputIndex (מחרוזת opName)

מקבל אינדקס של פלט בהינתן שם הפעולה של הפלט.

פרמטרים
opName

ציבורי Tensor getOutputTensor (אינדקס פלט קלט)

הפונקציה מקבלת את ה-Tensor שמשויך לאינדקס הפלט שסופק.

הערה: ייתכן שהפרטים של ארגומנט הפלט (למשל צורה) לא יאוכלסו במלואם עד לאחר ההסקה מבוצעת. אם דרושים לך פרטים מעודכנים *לפני* הפעלת ההסקה (למשל, אחרי שינוי גודל את Tensor הקלט, שעשוי לפסול צורות T tensor פלט, השתמש ב-allocateTensors() כדי להפעיל במפורש הקצאה והפצה של צורות. חשוב לשים לב שלתרשימים עם צורות פלט שתלויות בערכי *ערכי קלט*, ייתכן שצורת הפלט לא תיקבע במלואה עד במהלך ההסקה הזו.

פרמטרים
outputIndex

ציבורי INT getOutputTensorCount ()

הפונקציה מקבלת את מספר Tensors הפלט.

ציבורי Tensor getOutputTensorFromSignature (מחרוזתoutputName, מחרוזתSignatureKey)

הפונקציה מקבלת את ה-Tensor שמשויך לשם הפלט שסופק ב-method של חתימה ספציפית.

הערה: ייתכן שהפרטים של ארגומנט הפלט (למשל צורה) לא יאוכלסו במלואם עד לאחר ההסקה מבוצעת. אם דרושים לך פרטים מעודכנים *לפני* הפעלת ההסקה (למשל, אחרי שינוי גודל את Tensor הקלט, שעשוי לפסול צורות T tensor פלט, השתמש ב-allocateTensors() כדי להפעיל במפורש הקצאה והפצה של צורות. חשוב לשים לב שלתרשימים עם צורות פלט שתלויות בערכי *ערכי קלט*, ייתכן שצורת הפלט לא תיקבע במלואה עד במהלך ההסקה הזו.

אזהרה: זהו API ניסיוני והוא עשוי להשתנות.

פרמטרים
outputName שם הפלט בחתימה.
signatureKey מפתח חתימה המזהה את ה-SignatureDef יכול להיות null אם המודל כולל חתימה אחת.
קליעות
IllegalArgumentException אם outputName או signatureKey הם null או צוין שם ריק או לא תקין.

ציבורי String[] getSignatureInputs (מחרוזתSignatureKey)

הפונקציה מקבלת את רשימת ערכי הקלט של SignatureDefs ל-method signatureKey.

אזהרה: זהו API ניסיוני והוא עשוי להשתנות.

פרמטרים
signatureKey

ציבורי String[] getSignatureKeys ()

מקבלת את רשימת שמות השיטות שיוצאו באמצעות SignatureDef וזמינים במודל.

אזהרה: זהו API ניסיוני והוא עשוי להשתנות.

ציבורי String[] getSignatureOutputs (מחרוזתSignatureKey)

קבלת רשימת הפלט של SignatureDefs ל-method signatureKey.

אזהרה: זהו API ניסיוני והוא עשוי להשתנות.

פרמטרים
signatureKey

ציבורי ריק resetVariableTensors ()

מתקדם: איפוס כל הפרמטרים של המשתנים לערך ברירת המחדל.

אם למשתנה tensor לא משויך מאגר נתונים זמני, הוא יאופס לאפס.

אזהרה: זהו API ניסיוני והוא עשוי להשתנות.

ציבורי ריק resizeInput (int idx, int[] מעומעם, בוליאני קפדני)

משנה את גודל הקלט מסוג idx-th של המודל המקורי לעמימות הנתונים הנתונים.

אם הערך של 'strict' הוא True, אפשר לשנות את הגודל רק של מאפיינים לא ידועים. מאפיינים לא ידועים הם מצוין כ-'-1' במערך שהוחזר על ידי 'Tensor.shapeSignature() '.

פרמטרים
IDx
מעומעם
מחמיר

ציבורי ריק resizeInput (int idx, int[] מעומעם)

משנה את גודל הקלט מסוג idx-th של המודל המקורי לעמימות הנתונים הנתונים.

פרמטרים
IDx
מעומעם

ציבורי ריק הרצה (אובייקט, קלט, אובייקט פלט)

מפעילה את מסקנות המודל אם המודל מקבל רק קלט אחד ומספק רק פלט אחד.

אזהרה: ה-API יעיל יותר אם Buffer (עדיף להיות ישיר, אבל לא נדרש) משמש כסוג נתוני הקלט/פלט. כדאי להשתמש ב-Buffer כדי להזין ולאחזר נתונים ראשוניים לשיפור הביצועים. הסוגים הממשיים הבאים של Buffer הם נתמך:

  • ByteBuffer – תואם לכל סוג של Tensor פרימיטיבי.
  • FloatBuffer – תואם למכשירי Tensor מצופים.
  • IntBuffer – תואם למכשירי int32 Tensor.
  • LongBuffer – תואם למכשירי int64 של Tensor.
לתשומת ליבכם: סוגים בוליאניים נתמכים רק כמערכים, לא כ-Buffer או כקלט סקלרי.

פרמטרים
קלט מערך או מערך רב-מימדי, או Buffer של סוגים פרימיטיביים כולל int, float, long ו-byte. Buffer הוא הדרך המועדפת להעביר שידורים חיים נתוני קלט עבור טיפוסים פרימיטיביים, ואילו סוגי מחרוזות מחייבים שימוש באופרטור (רב-מימדי) נתיב הקלט של מערך. כשמשתמשים ב-Buffer, התוכן שלו צריך להישאר ללא שינוי עד הסקת מסקנות, והמתקשר חייב לוודא שה-Buffer נמצא מיקום קריאה מתאים. מותר להזין ערך של null רק אם המתקשר משתמש ב- Delegate שמאפשר יכולת פעולה הדדית של מאגר נתונים זמני, ומאגר נתונים זמני כזה קושר קלט Tensor.
output מערך רב-מימדי של נתוני פלט, או Buffer של סוגים פרימיטיביים כולל int, float, long ו-byte. כשנעשה שימוש ב-Buffer, המתקשר צריך לוודא להגדיר את מיקום הכתיבה המתאים. מותר להשתמש בערך null, והוא שימושי עבור במקרים מסוימים, למשל אם המתקשר משתמש ב-Delegate שמאפשר נקודת אחיזה למאגר הנתונים הזמני יכולת פעולה הדדית, ומאגר נתונים זמני כזה קושר לפלט Tensor (אפשר לעיין גם ב-Interpreter.Options#setAllowBufferHandleOutput(boolean)), או אם התרשים יצר פלט באופן דינמי והמתקשר צריך לשלוח שאילתה על הצורה Tensor של הפלט לאחר הפעלת ההסקה, ולאחזר את הנתונים ישירות מהפלט tensor (דרך Tensor.asReadOnlyBuffer()).

ציבורי ריק runForMultipleInputsOutputs (אובייקט[] קלט, מפה<מספר שלםאובייקט> פלטים)

מפעילה את ההֶקֵּשׁ של המודל אם המודל מקבל כמה קלטים, או מחזיר כמה פלטים.

אזהרה: ה-API יעיל יותר אם פונקציות Buffer (עדיף ישירות, אבל לא נדרש) משמשים כסוגי נתוני קלט/פלט. כדאי להשתמש ב-Buffer כדי להזין ולאחזר נתונים ראשוניים לשיפור הביצועים. הסוגים הממשיים הבאים של Buffer הם נתמך:

  • ByteBuffer – תואם לכל סוג של Tensor פרימיטיבי.
  • FloatBuffer – תואם למכשירי Tensor מצופים.
  • IntBuffer – תואם למכשירי int32 Tensor.
  • LongBuffer – תואם למכשירי int64 של Tensor.
לתשומת ליבכם: סוגים בוליאניים נתמכים רק כמערכים, לא כ-Buffer או כקלט סקלרי.

הערה: null לרכיבים נפרדים של inputs ו-outputs הם מותרת רק אם המתקשר משתמש ב-Delegate שמאפשר יכולת פעולה הדדית של מאגר נתונים זמני, וגם מאגר כזה קושר לקלט או לפלט המתאימים Tensor.

פרמטרים
נתוני קלט מערך של נתוני קלט. סדר הקלט צריך להיות זהה לזה של מודל טרנספורמר. כל קלט יכול להיות מערך או מערך רב-מימדי, או Buffer טיפוסים פרימיטיביים, כולל int, float, long ו-byte. הדרך המועדפת היא Buffer להעברת נתוני קלט גדולים, ואילו סוגי מחרוזות מחייבים שימוש במערך (רב-מימדי) בנתיב הקלט. כאשר משתמשים ב-Buffer, התוכן שלו צריך להישאר ללא שינוי עד שהמודל הסקת מסקנות, והמתקשר חייב לוודא שהBuffer נמצא בזמן המתאים מצב קריאה.
פלט מיפוי של מדדי פלט במפה למערכים רב-ממדיים של נתוני פלט או ל-Buffers של סוגים פרימיטיביים, כולל int, float, long ו-byte. צריך רק לשמור של הפלט שבו יש להשתמש. כשנעשה שימוש ב-Buffer, המתקשר צריך לוודא להגדיר את מיקום הכתיבה המתאים. המפה עשויה להיות ריקה במקרים שבהם משתמשים במאגרי נתונים זמניים לצורך מאגר נתונים של פלט img_tensor, או במקרים שבהם הפלטים נעשים באופן דינמי. והקוראים צריכים לשלוח שאילתה לצורת הפלט Tensor לאחר ההסקה להפעיל, לאחזר את הנתונים ישירות מקטע הפלט (דרך Tensor.asReadOnlyBuffer()).

ציבורי ריק runSignature (מפה<מחרוזתאובייקט> קלט, מפה<מחרוזתאובייקט> פלטים)

זהה ל-runSignature(Map, Map, String), אבל לא מחייב העברה של SignatureKey, בהנחה שלמודל יש SignatureDef אחד. אם למודל יש יותר מ-SignatureDef אחד, הוא להקפיץ הודעת שגיאה.

אזהרה: זהו API ניסיוני והוא עשוי להשתנות.

פרמטרים
נתוני קלט
פלט

ציבורי ריק runSignature (מפה<מחרוזתאובייקט> קלט, מפה<מחרוזתאובייקט> פלטים, מחרוזת חתימת מפתח)

מפעילה את מסקנות המודל על סמך SignatureDef שסופק דרך signatureKey.

ניתן למצוא פרטים נוספים על סוגי הקלט והפלט המותרים בכתובת run(Object, Object) סוגי נתונים שונים.

אזהרה: זהו API ניסיוני והוא עשוי להשתנות.

פרמטרים
נתוני קלט מפה משם הקלט ב-SignatureDef לאובייקט הקלט.
פלט מפה משם הפלט ב-SignatureDef לפלט נתוני הפלט. יכול להיות שהשדה הזה יהיה ריק אם רוצה להריץ שאילתות על הנתונים של Tensor ישירות לאחר הסקת המסקנות (למשל, אם צורת הפלט היא דינמית, או שנעשה שימוש בנקודות אחיזה למאגר הנתונים הזמני של הפלט).
signatureKey מפתח חתימה המזהה את ה-SignatureDef.
קליעות
IllegalArgumentException אם הערך של inputs הוא null או ריק, אם outputs או הערך signatureKey הוא null, או אם מתרחשת שגיאה בזמן הרצת ההסקה.

ציבורי ריק setCancelled (בוליאני בוטל)

מתקדם: הפרעה להסקת המסקנות באמצע השיחה אל run(Object, Object).

דגל ביטול יוגדר כ-True כשמפעילים את הפונקציה הזו. המתרגם בודקים את הדגל בין הפעלות של הפעלה, ואם הוא true, המתרגם יפסיק להגדיר. המתרגם יישאר במצב מבוטל עד שהוא 'לא בוטל' באופן מפורש לפי setCancelled(false)

אזהרה: זהו API ניסיוני והוא עשוי להשתנות.

פרמטרים
בוטל true כדי לבטל את ההסקה בדרך הטובה ביותר. false עד בקורות החיים שלו.
קליעות
IllegalStateException אם המתרגם לא מאותחל מושבתת כברירת מחדל.