Interpreter

مترجم من الدرجة النهائية العامة

فئة السائق لتوجيه استدلال النموذج باستخدام TensorFlow Lite.

ملاحظة: إذا لم تكن بحاجة إلى الوصول إلى أي من ميزات API "التجريبية" أدناه ، تفضل استخدام InterpreterApi و InterpreterFactory بدلاً من استخدام المترجم الفوري.

يقوم 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 ، المتوفرة عبر getInputTensor(int) و getOutputTensor(int) .

تحذير: مثيلات Interpreter ليست آمنة مع مؤشر الترابط. يمتلك Interpreter الموارد التي يجب تحريرها صراحة من خلال استدعاء close()

تم إنشاء مكتبة TFLite مقابل NDK API 19. وقد تعمل مع مستويات واجهة برمجة تطبيقات Android التي تقل عن 19 ، ولكنها غير مضمونة.

فئات متداخلة

فصل مترجم خيارات فئة خيارات للتحكم في سلوك مترجم وقت التشغيل.

المقاولون العامون

المترجم ( ملف نموذج الملف)
يهيئ Interpreter .
المترجم (ملف نموذج الملف ، المترجم ، خيارات الخيارات )
يقوم بتهيئة Interpreter ويحدد الخيارات لتخصيص سلوك المترجم الفوري.
مترجم ( ByteBuffer byteBuffer)
يقوم بتهيئة Interpreter فوري باستخدام ByteBuffer لملف نموذج.
المترجم ( ByteBuffer byteBuffer، Interpreter.Options options)
يقوم بتهيئة Interpreter باستخدام ByteBuffer لملف نموذج ومجموعة من Interpreter.Options المخصصة.

الطرق العامة

فارغ
تخصيص
يقوم صراحة بتحديث التخصيصات لجميع الموترات ، إذا لزم الأمر.
فارغ
إغلاق ()
قم بتحرير الموارد المرتبطة بمثيل InterpreterApi .
int
getInputIndex ( سلسلة opName)
يحصل على فهرس للمدخلات مع إعطاء اسم المرجع للإدخال.
موتر
getInputTensor (int inputIndex)
يحصل على Tensor مرتبط بفهرس الإدخال المقدم.
int
getInputTensorCount ()
الحصول على عدد موترات الإدخال.
موتر
getInputTensorFromSignature (اسم إدخال السلسلة ، مفتاح توقيع السلسلة )
الحصول على Tensor المقترن باسم الإدخال المقدم واسم أسلوب التوقيع.
طويل
getLastNativeInferenceDurationNanoseconds ()
إرجاع توقيت الاستدلال الأصلي.
int
getOutputIndex ( سلسلة opName)
يحصل على فهرس ناتج معطى اسم المرجع الخاص بالمخرجات.
موتر
getOutputTensor (int outputIndex)
يحصل على Tensor مرتبط بفهرس الإخراج المقدم.
int
getOutputTensorCount ()
الحصول على عدد موتر الإخراج.
موتر
getOutputTensorFromSignature (اسم إخراج السلسلة ، مفتاح توقيع السلسلة )
يحصل على Tensor مرتبطًا باسم الإخراج المقدم بطريقة توقيع محددة.
خيط[]
getSignatureInputs ( String signatureKey)
الحصول على قائمة مدخلات SignatureDefs signatureKey الأسلوب.
خيط[]
getSignatureKeys ()
الحصول على قائمة بأسماء أساليب تصدير SignatureDef المتوفرة في النموذج.
خيط[]
getSignatureOutputs ( String signatureKey)
الحصول على قائمة مخرجات SignatureDefs signatureKey الأسلوب.
فارغ
resetVariableTensors ()
متقدم: يعيد تعيين كل الموترات المتغيرة إلى القيمة الافتراضية.
فارغ
resizeInput (int idx، int [] dims، boolean strict)
يغير حجم إدخال idx-th للنموذج الأصلي إلى التعتيم المحدد.
فارغ
resizeInput (int idx، int [] dims)
يغير حجم إدخال idx-th للنموذج الأصلي إلى التعتيم المحدد.
فارغ
تشغيل (إدخال الكائن ، إخراج الكائن )
لتشغيل استنتاج النموذج إذا كان النموذج يأخذ إدخالًا واحدًا فقط ، ويقدم ناتجًا واحدًا فقط.
فارغ
runForMultipleInputsOutputs ( كائن [] المدخلات ، خريطة < عدد صحيح ، كائن > المخرجات)
لتشغيل استدلال النموذج إذا كان النموذج يأخذ مدخلات متعددة ، أو يُرجع مخرجات متعددة.
فارغ
runSignature ( خريطة < سلسلة ، كائن > المدخلات ، خريطة < سلسلة ، كائن > المخرجات)
مثل runSignature(Map, Map, String) لكنه لا يتطلب تمرير مفتاح توقيع ، بافتراض أن النموذج يحتوي على SignatureDef واحد.
فارغ
runSignature ( خريطة < سلسلة ، كائن > المدخلات ، خريطة < سلسلة ، كائن > المخرجات ، مفتاح توقيع السلسلة )
يقوم بتشغيل نموذج الاستدلال بناءً على SignatureDef المقدم من خلال signatureKey .
فارغ
setCancelled (تم إلغاء منطقية)
متقدم: يقاطع الاستدلال في منتصف استدعاء run(Object, Object) .

الطرق الموروثة

المقاولون العامون

مترجم عام ( ملف نموذج الملف)

يهيئ Interpreter .

حدود
modelFile ملف نموذج TF Lite مدرب مسبقًا.
رميات
غير الشرعيين استثناء حجة إذا لم يقم modelFile بتشفير نموذج TensorFlow Lite صالح.

مترجم عام ( ملف نموذج الملف ، مترجم ، خيارات الخيارات)

يقوم بتهيئة Interpreter ويحدد الخيارات لتخصيص سلوك المترجم الفوري.

حدود
modelFile ملف نموذج TF Lite مدرب مسبقًا
خيارات مجموعة من الخيارات لتخصيص سلوك المترجم الفوري
رميات
غير الشرعيين استثناء حجة إذا لم يقم modelFile بتشفير نموذج TensorFlow Lite صالح.

مترجم عام ( ByteBuffer byteBuffer)

يقوم بتهيئة Interpreter فوري باستخدام ByteBuffer لملف نموذج.

لا ينبغي تعديل ByteBuffer بعد إنشاء Interpreter . يمكن أن يكون ByteBuffer إما MappedByteBuffer الذي يقوم الذاكرة بتعيين ملف نموذج ، أو ByteBuffer مباشر من nativeOrder () يحتوي على محتوى بايت للنموذج.

حدود
بايت بوفير
رميات
غير الشرعيين استثناء حجة إذا لم يكن byteBuffer عبارة عن MappedByteBuffer ولا ByteBuffer مباشرًا لـ originalOrder.

مترجم عام ( ByteBuffer byteBuffer، Interpreter.Options options)

يقوم بتهيئة Interpreter باستخدام ByteBuffer لملف نموذج ومجموعة من Interpreter.Options المخصصة.

لا ينبغي تعديل ByteBuffer بعد إنشاء Interpreter . يمكن أن يكون ByteBuffer إما MappedByteBuffer الذي يقوم الذاكرة بتعيين ملف نموذج ، أو ByteBuffer مباشر من nativeOrder () يحتوي على محتوى بايت للنموذج.

حدود
بايت بوفير
خيارات
رميات
غير الشرعيين استثناء حجة إذا لم يكن byteBuffer عبارة عن MappedByteBuffer ولا ByteBuffer مباشرًا لـ originalOrder.

الطرق العامة

تخصيص الفراغ العام

يقوم صراحة بتحديث التخصيصات لجميع الموترات ، إذا لزم الأمر.

سيؤدي هذا إلى نشر الأشكال وتخصيصات الذاكرة للموترات التابعة باستخدام شكل (أشكال) موتر الإدخال كما هو محدد.

ملاحظة: هذه المكالمة * اختيارية بحتة *. سيحدث تخصيص الموتر تلقائيًا أثناء التنفيذ إذا تم تغيير حجم أي موتر للإدخال. هذه المكالمة مفيدة للغاية في تحديد الأشكال لأي موتر إخراج قبل تنفيذ الرسم البياني ، على سبيل المثال ،

 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 .

public int getInputIndex ( String opName)

يحصل على فهرس للمدخلات مع إعطاء اسم المرجع للإدخال.

حدود
الاسم

موتر عام getInputTensor (int inputIndex)

يحصل على Tensor مرتبط بفهرس الإدخال المقدم.

حدود
المدخلات

int العامة getInputTensorCount ()

الحصول على عدد موترات الإدخال.

Tensor العام getInputTensorFromSignature (اسم إدخال السلسلة ، مفتاح توقيع السلسلة )

الحصول على Tensor المقترن باسم الإدخال المقدم واسم أسلوب التوقيع.

تحذير: هذه واجهة برمجة تطبيقات تجريبية وقابلة للتغيير.

حدود
اسم الإدخال أدخل الاسم في التوقيع.
التوقيع يمكن أن يكون مفتاح التوقيع الذي يحدد SignatureDef فارغًا إذا كان للنموذج توقيع واحد.
رميات
غير الشرعيين استثناء حجة إذا كان inputName أو signatureKey فارغًا أو فارغًا ، أو تم توفير اسم غير صالح.

عامة getLastNativeInferenceDurationNanoseconds طويل ()

إرجاع توقيت الاستدلال الأصلي.

getOutputIndex int العامة ( سلسلة opName)

يحصل على فهرس ناتج معطى اسم المرجع الخاص بالمخرجات.

حدود
الاسم

موتر عام getOutputTensor (مؤشر إخراج int)

يحصل على Tensor مرتبط بفهرس الإخراج المقدم.

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

حدود
الإخراج

int العامة getOutputTensorCount ()

الحصول على عدد موتر الإخراج.

Tensor العام getOutputTensorFromSignature ( String outputName ، String signatureKey)

يحصل على Tensor مرتبطًا باسم الإخراج المقدم بطريقة توقيع محددة.

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

تحذير: هذه واجهة برمجة تطبيقات تجريبية وقابلة للتغيير.

حدود
اسم الإخراج اسم الإخراج في التوقيع.
التوقيع يمكن أن يكون مفتاح التوقيع الذي يحدد SignatureDef فارغًا إذا كان للنموذج توقيع واحد.
رميات
غير الشرعيين استثناء حجة إذا كان outputName أو signatureKey فارغًا أو فارغًا ، أو تم توفير اسم غير صالح.

سلسلة عامة [] getSignatureInputs ( String signatureKey)

الحصول على قائمة مدخلات SignatureDefs signatureKey الأسلوب.

تحذير: هذه واجهة برمجة تطبيقات تجريبية وقابلة للتغيير.

حدود
التوقيع

سلسلة عامة [] getSignatureKeys ()

الحصول على قائمة بأسماء أساليب تصدير SignatureDef المتوفرة في النموذج.

تحذير: هذه واجهة برمجة تطبيقات تجريبية وقابلة للتغيير.

سلسلة عامة [] getSignatureOutputs ( String signatureKey)

الحصول على قائمة مخرجات SignatureDefs signatureKey الأسلوب.

تحذير: هذه واجهة برمجة تطبيقات تجريبية وقابلة للتغيير.

حدود
التوقيع

إعادة تعيين الفراغ العام

متقدم: يعيد تعيين كل الموترات المتغيرة إلى القيمة الافتراضية.

إذا لم يكن للموتر المتغير مخزن مؤقت مرتبط به ، فسيتم إعادة تعيينه إلى الصفر.

تحذير: هذه واجهة برمجة تطبيقات تجريبية وقابلة للتغيير.

إدخال تغيير حجم الفراغ العام (int idx، int [] dims، boolean strict)

يغير حجم إدخال idx-th للنموذج الأصلي إلى التعتيم المحدد.

عندما تكون "صارمة" صحيحة ، يمكن فقط تغيير حجم الأبعاد غير المعروفة. يُشار إلى الأبعاد غير المعروفة كـ "-1" في المصفوفة التي يتم إرجاعها بواسطة `Tensor.shapeSignature ()`.

حدود
معرف
يخفت
حازم

إدخال تغيير حجم الفراغ العام (int idx، int [] dims)

يغير حجم إدخال idx-th للنموذج الأصلي إلى التعتيم المحدد.

حدود
معرف
يخفت

تشغيل باطل عام (إدخال كائن ، إخراج كائن )

لتشغيل استنتاج النموذج إذا كان النموذج يأخذ إدخالًا واحدًا فقط ، ويقدم ناتجًا واحدًا فقط.

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

  • ByteBuffer - متوافق مع أي نوع Tensor أساسي أساسي.
  • FloatBuffer - متوافق مع موتر عائم.
  • IntBuffer - متوافق مع Tensors int32.
  • LongBuffer - متوافق مع Tensors int64.
لاحظ أن الأنواع المنطقية مدعومة فقط كمصفوفات ، وليس Buffer ، أو كمدخلات عددية.

حدود
مدخل مصفوفة أو مصفوفة متعددة الأبعاد ، أو Buffer للأنواع الأولية بما في ذلك int ، و float ، و long ، و byte. Buffer هو الطريقة المفضلة لتمرير بيانات الإدخال الكبيرة للأنواع الأولية ، بينما تتطلب أنواع السلسلة استخدام مسار إدخال الصفيف (متعدد الأبعاد). عند استخدام Buffer ، يجب أن يظل محتواه دون تغيير حتى يتم استدلال النموذج ، ويجب على المتصل التأكد من أن Buffer في موضع القراءة المناسب. لا يُسمح بقيمة null إلا إذا كان المتصل يستخدم Delegate يسمح بتداخل التعامل مع المخزن المؤقت ، وقد تم ربط هذا المخزن المؤقت بمدخل Tensor .
انتاج مصفوفة متعددة الأبعاد لبيانات الإخراج ، أو Buffer مؤقت للأنواع الأولية بما في ذلك int و float و long و byte. عند استخدام Buffer ، يجب على المتصل التأكد من تعيين موضع الكتابة المناسب. يُسمح باستخدام قيمة خالية ، وهي مفيدة في حالات معينة ، على سبيل المثال ، إذا كان المتصل يستخدم Delegate يسمح بالتداخل بين مقبض المخزن المؤقت ، وكان هذا المخزن المؤقت مرتبطًا بإخراج Tensor (انظر أيضًا Interpreter.Options # setAllowBufferHandleOutput (منطقي) ) ، أو إذا كان الرسم البياني قد شكل مخرجات ديناميكيًا ويجب على المتصل الاستعلام عن شكل Tensor الناتج بعد استدعاء الاستدلال ، وجلب البيانات مباشرة من موتر الإخراج (عبر Tensor.asReadOnlyBuffer() ).

public void runForMultipleInputsOutputs ( Object [] inputs، Map < Integer ، Object > outputs)

لتشغيل استدلال النموذج إذا كان النموذج يأخذ مدخلات متعددة ، أو يُرجع مخرجات متعددة.

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

  • ByteBuffer - متوافق مع أي نوع Tensor أساسي أساسي.
  • FloatBuffer - متوافق مع موتر عائم.
  • IntBuffer - متوافق مع Tensors int32.
  • LongBuffer - متوافق مع Tensors int64.
لاحظ أن الأنواع المنطقية مدعومة فقط كمصفوفات ، وليس Buffer ، أو كمدخلات عددية.

ملاحظة: لا يُسمح بالقيم null للعناصر غير الصالحة inputs outputs إلا إذا كان المتصل يستخدم Delegate يتيح إمكانية التشغيل المتداخل لمخزن التخزين المؤقت ، وكان هذا المخزن المؤقت مرتبطًا بالإدخال أو الإخراج المقابل Tensor (s).

حدود
المدخلات مجموعة من البيانات المدخلة. يجب أن تكون المدخلات بنفس ترتيب مدخلات النموذج. يمكن أن يكون كل إدخال عبارة عن مصفوفة أو مصفوفة متعددة الأبعاد ، أو Buffer للأنواع الأولية بما في ذلك int ، و float ، و long ، و byte. Buffer هو الطريقة المفضلة لتمرير بيانات الإدخال الكبيرة ، بينما تتطلب أنواع السلاسل استخدام مسار إدخال الصفيف (متعدد الأبعاد). عند استخدام Buffer ، يجب أن يظل محتواه دون تغيير حتى يتم استدلال النموذج ، ويجب على المتصل التأكد من أن Buffer في موضع القراءة المناسب.
النواتج تعيين مؤشرات الإخراج إلى المصفوفات متعددة الأبعاد لبيانات الإخراج أو Buffer المؤقت للأنواع البدائية بما في ذلك int ، و float ، و long ، و byte. يحتاج فقط إلى الاحتفاظ بإدخالات للمخرجات لاستخدامها. عند استخدام Buffer ، يجب على المتصل التأكد من تعيين موضع الكتابة المناسب. قد تكون الخريطة فارغة للحالات التي يتم فيها استخدام مقابض المخزن المؤقت لبيانات موتر الإخراج ، أو الحالات التي يتم فيها تشكيل المخرجات ديناميكيًا ويجب على المتصل الاستعلام عن شكل Tensor الناتج بعد استدعاء الاستدلال ، وجلب البيانات مباشرة من موتر الإخراج ( عبر Tensor.asReadOnlyBuffer() ).

توقيع عام باطل عام ( خريطة < سلسلة ، كائن > المدخلات ، خريطة < سلسلة ، كائن > مخرجات)

مثل runSignature(Map, Map, String) لكنه لا يتطلب تمرير مفتاح توقيع ، بافتراض أن النموذج يحتوي على SignatureDef واحد. إذا كان النموذج يحتوي على أكثر من SignatureDef ، فسيتم طرح استثناء.

تحذير: هذه واجهة برمجة تطبيقات تجريبية وقابلة للتغيير.

حدود
المدخلات
النواتج

تشغيل توقيع عام باطل ( خريطة < سلسلة ، كائن > مدخلات ، خريطة < سلسلة ، كائن > مخرجات ، مفتاح توقيع سلسلة )

يقوم بتشغيل نموذج الاستدلال بناءً على SignatureDef المقدم من خلال signatureKey .

راجع run(Object, Object) لمزيد من التفاصيل حول أنواع بيانات الإدخال والإخراج المسموح بها.

تحذير: هذه واجهة برمجة تطبيقات تجريبية وقابلة للتغيير.

حدود
المدخلات خريطة من اسم الإدخال في SignatureDef إلى كائن إدخال.
النواتج خريطة من اسم الإخراج في SignatureDef لإخراج البيانات. قد يكون هذا فارغًا إذا رغب المتصل في الاستعلام عن بيانات Tensor مباشرة بعد الاستدلال (على سبيل المثال ، إذا كان شكل الإخراج ديناميكيًا ، أو تم استخدام مقابض المخزن المؤقت للإخراج).
التوقيع مفتاح التوقيع الذي يحدد SignatureDef.
رميات
غير الشرعيين استثناء حجة إذا كانت inputs فارغة أو فارغة ، أو إذا كانت outputs أو signatureKey فارغًا ، أو إذا حدث خطأ عند تشغيل الاستدلال.

مجموعة الفراغ العام تم إلغاؤها (تم إلغاء منطقية)

متقدم: يقاطع الاستدلال في منتصف استدعاء run(Object, Object) .

سيتم تعيين علامة الإلغاء على صواب عند استدعاء هذه الوظيفة. سيتحقق المترجم من العلم بين استدعاءات المرجع ، وإذا كان هذا true ، فسيتوقف المترجم عن التنفيذ. سيبقى المترجم الفوري في حالة الإلغاء حتى "غير مُلغى" بشكل صريح بواسطة setCancelled(false) .

تحذير: هذه واجهة برمجة تطبيقات تجريبية وقابلة للتغيير.

حدود
ألغيت true لإلغاء الاستدلال بأفضل طريقة ؛ استئناف false .
رميات
استثناء الدولة غير القانوني إذا لم تتم تهيئة المترجم الفوري باستخدام الخيار القابل للإلغاء ، والذي يتم إيقاف تشغيله افتراضيًا.