polarization op• Data kinds: matrix → table
• Call: import fullseye as fs; fs.ledger.mueller_checks(mueller, tol=1e-09) (implementation को सीधे call करना हो तो import optics; optics.mueller_checks(mueller, tol=1e-09), registry से लेना हो तो opsoptics.get("mueller_checks"))
बताता है कि 4x4 matrix भौतिक रूप से संभव Mueller matrix है या नहीं, और वह कितना depolarising है।
> नीचे का विस्तृत विवरण मूल text में है — सारांश और headings का अनुवाद हो चुका है।
Returns a dict:
physical
True iff the coherency matrix H = 1/4 sum_ij M_ij (sigma_i (x) sigma_j^*)
is positive semidefinite — Cloude's criterion (1986), the necessary and
sufficient condition for M to be a convex sum of pure (Mueller–Jones)
matrices (Gil, 2007). coherency_eigenvalues carries the four real
eigenvalues (descending) so the caller sees *how* far from physical.
pure
one non-zero eigenvalue: M comes from a single Jones matrix (no
depolarisation). Every element from mueller_element except the
depolariser is pure.
depolarization_index
Gil–Bernabeu P_Delta = sqrt((sum_ij M_ij^2 - M_00^2) / (3 M_00^2)):
1 for a pure matrix, 0 for the ideal depolariser.
passive
the largest transmittance M_00 + sqrt(M_01^2 + M_02^2 + M_03^2) is
<= 1 — a passive element cannot amplify.
transmittance_max / transmittance_min
those two bounds of the transmitted intensity over all input states.
Ground truth in the tests: every mueller_element kind is physical and passive; the pure ones have eigenvalues (M_00, 0, 0, 0) to 1e-12 and P_Delta = 1; the ideal depolariser has P_Delta = 0; a matrix with M_11 > M_00 (more polarised output than input) is refused as non-physical; a gain matrix (2 I) is physical but not passive.
Raises ValueError: not a real 4x4 matrix, non-finite, or M_00 <= 0 (no transmitted intensity — every ratio would be 0/0).
Provenance: Cloude, S. R. (1986), *Optik* 75, 26; Gil, J. J. & Bernabeu, E. (1986), *Optica Acta* 33, 185 (depolarisation index); the check set mirrors what py-pol (del Hoyo & Sánchez Brea, MIT) exposes as is_physical / is_pure / is_transmissive, re-implemented from the definitions.
optics के सभी ops गणना से पहले input की जाँच करते हैं (कुछ भी चुपचाप पास नहीं होता):
• Unit argument के नाम में ही लिखी होती है — _mm / _um / _deg / _mrad। mm और µm की गड़बड़ी crash नहीं करती, बल्कि "सही दिखने वाला पर गलत उत्तर" देती है, इसलिए नाम से इसे रोका जाता है। मान के आकार से unit का अनुमान बिल्कुल नहीं लगाया जाता।
• String से ValueError — float('50') सफल हो जाता है, इसलिए बिना parse किया config value length के रूप में निकल जाता (मापा गया: thin_lens('50', '200') सही दिखने वाला 66.667 mm लौटा रहा था)। bool को भी True == 1 वाले implicit promotion के रूप में अस्वीकार किया जाता है।
• complex / masked array से ValueError (केवल real-valued slots; imaginary part को चुपचाप छोड़ना या mask हटाना अस्वीकार)। हर input पर NaN/Inf से ValueError।
• शून्य से भाग और उससे जुड़े मामलों को नाम लेकर अस्वीकार किया जाता है: focal length 0, radius of curvature 0, refractive index <= 0, पूरी तरह opaque aperture (सब 0, इसलिए normalisation 0/0), ऐसा PSF जिसका योग <= 0 हो, S0 = 0 वाला Stokes vector, और front focal point पर रखा object (image अनंत पर)।
• केवल 2 ops non-finite value लौटाते हैं, और वह भी contract के रूप में लिखा हुआ: depth_of_field hyperfocal distance से आगे far_mm = inf (hyperfocal distance की परिभाषा यही है) और gaussian_beam waist पर wavefront_radius_mm = inf (plane wavefront की radius of curvature)। दोनों साथ में एक finite साथी (far_is_infinite / curvature_per_mm) भी लौटाते हैं। इसके अलावा कोई भी चुपचाप आया NaN/Inf अंदर ही पकड़ा जाता है और ValueError देता है — "float64 overflow हुआ" और "उत्तर अनंत है" अलग-अलग दावे हैं, इसलिए पहले को दूसरे का चेहरा पहनाकर नहीं लौटाया जाता।
• Size की सीमा: generate होने वाले grid के लिए optics.MAX_GRID (4096), दिए गए field/PSF/aperture के लिए optics.MAX_FIELD_ELEMENTS (2^24), ABCD element chain के लिए optics.MAX_SYSTEM_ELEMENTS (1024), Zernike के लिए MAX_ZERNIKE_TERMS (512) / MAX_ZERNIKE_ORDER (40) / MAX_ZERNIKE_BASIS (2^25)। छोटे argument से बहुत बड़ा internal allocation होने वाले रास्तों (मापा गया: n_max=40 × 4096² पर 108 GB) को fail-closed ढंग से बंद किया गया है।
• भौतिक रूप से असंभव states भी अस्वीकार: degree of polarisation > 1 वाला Stokes vector, ऋणात्मक transmittance, ऋणात्मक intensity, और n-|m| odd जैसे अमान्य Zernike indices।
• Sample data catalog (DL URL / license) — 2-D के लिए skimage.data (BSD/public) + synthetic, 3-D के लिए real data sources (Stanford/PDS आदि) के DL URL।
• Operators का स्रोत और संदर्भ — इस op family के मूल research/methods के स्रोत।
• Algorithm का मानक स्रोत (लेखक, वर्ष) और उपयोग ऊपर की family usage guide में दिए गए हैं।
• polarization_camera_pipeline — py -3.11 examples/polarization_camera_pipeline.py
table को input के रूप में लेते हैं)abcd_matrix · wavefront_stats · sfr_from_edge · paraxial_trace · seidel_coefficients · spot_stats · tolerance_analysis · wavefront_from_opd
polarization)jones_element · jones_apply · stokes_from_jones · mueller_element · mueller_apply · stokes_analyze · polarization_demosaic · polarization_demosaic_color
*Provenance: optics.py — OPTICS operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.