**Fix reciprocal op crash on int32 input by raising ValueError (Fixes #2579)**
📝 Description
This PR addresses Issue #2579, where calling the reciprocal MIL op with int32 inputs causes an unexpected crash during SSA conversion.
🔧 Problem
Using mb.reciprocal(x=int32_tensor) leads to a runtime crash because reciprocal operations are invalid for int32 types. The crash occurred deep within the MIL SSA conversion without a clear error message, making it hard to debug.
✅ Fix
- Added an explicit
ValueErrorin thetype_inferencemethod of thereciprocalop forint32inputs. - This change provides clear, early feedback and avoids internal MIL crashes.
🧪 Tests
- ✅ New unit test added in
test_inverse_conversion.pyto verify theValueErroris raised correctly. - ✅ Existing tests pass with
pytest coremltools/test/test_inverse_conversion.py.
🧠 Files Changed
-
coremltools/converters/mil/mil/ops/defs/elementwise.py
➤ Added type check and exception forint32inputs inreciprocal.type_inference. -
coremltools/test/test_inverse_conversion.py
➤ Added test case to ensure invalidint32input raisesValueError.
🔗 Related Issue
Closes #2579
Hey @junpeiz! Could you please review my PR #2580 ? Thanks! 😊
Thank you @Pranaykarvi for contributing! I will let this week's oncaller (@abhishek-patel6) to take a look.
Hi, @Pranaykarvi . Thank you for the patch! I think that the conversion already throws an error. Original issue expects the torch compiler to implicitly convert to float. Probably something like https://github.com/apple/coremltools/blob/d4b83adcea0ba1d3ae01b06565bed5aa3bcd3e1c/coremltools/converters/mil/frontend/torch/ops.py#L7103-L7108
Thanks @abhishek-patel6!
I checked ops.py, and unlike log1p, there’s no frontend handler for inverse or reciprocal. The op is introduced internally during MIL lowering (e.g., for 16 / x.shape[0]), so casting can't happen in the frontend.
That’s why I added the check directly in the MIL op to raise a clear ValueError — it’s the only reliable place to catch this issue. Let me know if you’d prefer an alternate approach!
Thanks @abhishek-patel6!
I checked
ops.py, and unlikelog1p, there’s no frontend handler forinverseorreciprocal. The op is introduced internally during MIL lowering (e.g., for16 / x.shape[0]), so casting can't happen in the frontend.That’s why I added the check directly in the MIL op to raise a clear
ValueError— it’s the only reliable place to catch this issue. Let me know if you’d prefer an alternate approach!
I think there is a handler for inverse.
https://github.com/apple/coremltools/blob/d4b83adcea0ba1d3ae01b06565bed5aa3bcd3e1c/coremltools/converters/mil/frontend/torch/ops.py#L7087-L7090
Anyways, the linked issue requests for implicit conversion to float IIUC. Throwing an error message earlier wouldn't fix their original issue still.