Skip to content

Commit 3b29b20

Browse files
authored
Global Significant Figures Formatting
1 parent 9273ee0 commit 3b29b20

File tree

3 files changed

+134
-2
lines changed

3 files changed

+134
-2
lines changed

ivy/__init__.py

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ class Dtype:
3737
pass
3838

3939

40+
array_significant_figures_stack = list()
41+
array_decimal_values_stack = list()
42+
43+
4044
# global constants
4145
_MIN_DENOMINATOR = 1e-12
4246
_MIN_BASE = 1e-5
@@ -359,3 +363,125 @@ class StaticContainer(ContainerBase):
359363

360364
if "IVY_BACKEND" in os.environ:
361365
ivy.set_framework(os.environ["IVY_BACKEND"])
366+
367+
# Array Significant Figures #
368+
369+
370+
def _assert_array_significant_figures_formatting(sig_figs):
371+
assert isinstance(sig_figs, int)
372+
assert sig_figs > 0
373+
374+
375+
def _sf(x, sig_fig=3):
376+
if isinstance(x, np.bool_):
377+
return x
378+
f = float(np.format_float_positional(
379+
x, precision=sig_fig, unique=False, fractional=False, trim='k'
380+
))
381+
if np.issubdtype(type(x), np.uint) :
382+
f = np.uint(f)
383+
if np.issubdtype(type(x), np.int) :
384+
f = np.int(f)
385+
x = f
386+
return x
387+
388+
389+
vec_sig_fig = np.vectorize(_sf)
390+
vec_sig_fig.__name__ = 'vec_sig_fig'
391+
392+
393+
def array_significant_figures(sig_figs=None):
394+
"""Summary.
395+
396+
Parameters
397+
----------
398+
sig_figs
399+
optional int, number of significant figures to be shown when printing
400+
401+
Returns
402+
-------
403+
ret
404+
405+
"""
406+
if ivy.exists(sig_figs):
407+
_assert_array_significant_figures_formatting(sig_figs)
408+
return sig_figs
409+
global array_significant_figures_stack
410+
if not array_significant_figures_stack:
411+
ret = 3
412+
else:
413+
ret = array_significant_figures_stack[-1]
414+
return ret
415+
416+
417+
def set_array_significant_figures(sig_figs):
418+
"""Summary.
419+
420+
Parameters
421+
----------
422+
sig_figs
423+
optional int, number of significant figures to be shown when printing
424+
425+
"""
426+
_assert_array_significant_figures_formatting(sig_figs)
427+
global array_significant_figures_stack
428+
array_significant_figures_stack.append(sig_figs)
429+
430+
431+
def unset_array_significant_figures():
432+
""""""
433+
global array_significant_figures_stack
434+
if array_significant_figures_stack:
435+
array_significant_figures_stack.pop(-1)
436+
437+
# Decimal Values #
438+
439+
440+
def _assert_array_decimal_values_formatting(dec_vals):
441+
assert isinstance(dec_vals, int)
442+
assert dec_vals >= 0
443+
444+
445+
def array_decimal_values(dec_vals=None):
446+
"""Summary.
447+
448+
Parameters
449+
----------
450+
dec_vals
451+
optional int, number of decimal values to be shown when printing
452+
453+
Returns
454+
-------
455+
ret
456+
457+
"""
458+
if ivy.exists(dec_vals):
459+
_assert_array_decimal_values_formatting(dec_vals)
460+
return dec_vals
461+
global array_decimal_values_stack
462+
if not array_decimal_values_stack:
463+
ret = None
464+
else:
465+
ret = array_decimal_values_stack[-1]
466+
return ret
467+
468+
469+
def set_array_decimal_values(dec_vals):
470+
"""Summary.
471+
472+
Parameters
473+
----------
474+
dec_vals
475+
optional int, number of significant figures to be shown when printing
476+
477+
"""
478+
_assert_array_decimal_values_formatting(dec_vals)
479+
global array_decimal_values_stack
480+
array_decimal_values_stack.append(dec_vals)
481+
482+
483+
def unset_array_decimal_values():
484+
""""""
485+
global array_decimal_values_stack
486+
if array_decimal_values_stack:
487+
array_decimal_values_stack.pop(-1)

ivy/array/__init__.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from operator import mul
66

77
# local
8+
import numpy as np
89
from . import conversions
910
from .conversions import *
1011

@@ -198,9 +199,13 @@ def __array_wrap__(self, *args, **kwargs):
198199

199200
@_native_wrapper
200201
def __repr__(self):
201-
return (
202+
sig_fig = ivy.array_significant_figures()
203+
dec_vals = ivy.array_decimal_values()
204+
rep = ivy.vec_sig_fig(ivy.to_numpy(self._data),sig_fig) if self._size > 0 else ivy.to_numpy(self._data)
205+
with np.printoptions(precision=dec_vals):
206+
return (
202207
self._pre_repr
203-
+ ivy.to_numpy(self._data)
208+
+ rep
204209
.__repr__()[:-1]
205210
.partition(", dtype")[0]
206211
.partition(", dev")[0]

ivy/func_wrapper.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676
"fn_array_spec",
7777
"insert_into_nest_at_index",
7878
"insert_into_nest_at_indices",
79+
"vec_sig_fig"
7980
]
8081
METHODS_W_CONT_SUPPORT = [
8182
"multi_head_attention",

0 commit comments

Comments
 (0)