Profiling results ----------------- Total cpu time observed: 50318ms (out of 50840ms) Number of samples taken: 144 (once every 349ms) (Hiding functions with self<1.0% and local<2.0%: 2 of 109 hidden) ================================================================== Caller Idx Total Self Name+src Local% ms(pct) ms(pct) Callee ================================================================== ??? [7] 100.0% [1] 50318(100.0%) 0(0.0%) profile-thunk16 ...e/pkgs/profile-lib/main.rkt:9:0 run [4] 100.0% ------------------------------------------------------------------ ??? [7] 100.0% [2] 1674(3.3%) 0(0.0%) errors ...lies/herbie/develop/src/points.rkt:223:0 for-loop [5] 100.0% ------------------------------------------------------------------ loop [25] 100.0% [3] 334(0.7%) 0(0.0%) expand-capturing-lifts (unknown source) dispatch-transformer41 [6]100.0% ------------------------------------------------------------------ profile-thunk16 [1] 100.0% [4] 50318(100.0%) 0(0.0%) run ...et-7.0/share/pkgs/profile-lib/main.rkt:39:2 ??? [7] 100.0% ------------------------------------------------------------------ errors [2] 100.0% [5] 1674(3.3%) 0(0.0%) for-loop ...es/herbie/develop/src/points.rkt:225:2 ??? [7] 100.0% ------------------------------------------------------------------ expand-capturing-lifts [3]100.0% [6] 334(0.7%) 0(0.0%) dispatch-transformer41 (unknown source) apply-transformer52 [8] 100.0% ------------------------------------------------------------------ for-loop [5] 1.1% run [4] 49.4% [7] 50318(100.0%) 0(0.0%) ??? ...lects/racket/private/more-scheme.rkt:261:28 profile-thunk16 [1] 49.4% run-improve43 [9] 31.7% prepare-points [10] 15.1% errors [2] 1.1% ??? [72] 0.7% eval-errors [11] 0.6% oracle-error [12] 0.6% ulp-difference [23] 0.2% ??? [87] 0.2% ------------------------------------------------------------------ dispatch-transformer41 [6]100.0% [8] 334(0.7%) 0(0.0%) apply-transformer52 (unknown source) apply-post-expansion [13] 100.0% ------------------------------------------------------------------ ??? [7] 100.0% [9] 31878(63.4%) 0(0.0%) run-improve43 ...ie/develop/src/mainloop.rkt:339:0 simplify! [14] 100.0% ------------------------------------------------------------------ ??? [7] 100.0% [10] 15170(30.1%) 0(0.0%) prepare-points ...bie/develop/src/points.rkt:166:0 loop [15] 97.8% eval-prog [19] 2.2% ------------------------------------------------------------------ ??? [7] 100.0% [11] 654(1.3%) 0(0.0%) eval-errors ...herbie/develop/src/points.rkt:198:0 for-loop [16] 100.0% ------------------------------------------------------------------ ??? [7] 100.0% [12] 638(1.3%) 0(0.0%) oracle-error ...erbie/develop/src/points.rkt:207:0 for-loop [17] 100.0% ------------------------------------------------------------------ apply-transformer52 [8] 100.0% [13] 334(0.7%) 0(0.0%) apply-post-expansion (unknown source) gf [18] 100.0% ------------------------------------------------------------------ run-improve43 [9] 100.0% [14] 31878(63.4%) 0(0.0%) simplify! ...herbie/develop/src/mainloop.rkt:217:0 ??? [20] 100.0% ------------------------------------------------------------------ prepare-points [10] 100.0% [15] 14836(29.5%) 0(0.0%) loop ...htlies/herbie/develop/src/points.rkt:143:4 loop [21] 84.7% ??? [22] 9.0% andmap [24] 4.1% ordinary-value? [77] 2.2% ------------------------------------------------------------------ eval-errors [11] 100.0% [16] 654(1.3%) 0(0.0%) for-loop ...es/herbie/develop/src/points.rkt:200:2 ulp-difference [23] 50.8% ??? [72] 49.2% ------------------------------------------------------------------ oracle-error [12] 100.0% [17] 638(1.3%) 0(0.0%) for-loop ...es/herbie/develop/src/points.rkt:208:2 loop [65] 100.0% ------------------------------------------------------------------ apply-post-expansion [13] 20.0% loop [25] 80.0% [18] 334(0.7%) 0(0.0%) gf (unknown source) loop [25] 100.0% ------------------------------------------------------------------ prepare-points [10] 100.0% [19] 334(0.7%) 0(0.0%) eval-prog .../herbie/develop/src/programs.rkt:83:0 loop [25] 100.0% ------------------------------------------------------------------ simplify! [14] 100.0% [20] 31878(63.4%) 0(0.0%) ??? ...s/herbie/develop/src/core/simplify.rkt:26:0 for-loop [26] 92.6% loop [27] 6.5% one-iter [29] 0.9% ------------------------------------------------------------------ loop [15] 100.0% [21] 12562(25.0%) 0(0.0%) loop ...htlies/herbie/develop/src/points.rkt:102:2 ??? [72] 95.1% ??? [106] 4.9% ------------------------------------------------------------------ loop [15] 100.0% [22] 1336(2.7%) 0(0.0%) ??? ...ghtlies/herbie/develop/src/points.rkt:127:2 ??? [87] 76.8% curried [62] 23.2% ------------------------------------------------------------------ for-loop [16] 49.7% ??? [7] 50.3% [23] 668(1.3%) 0(0.0%) ulp-difference ...erbie/develop/src/float.rkt:46:0 infer-representation [28] 100.0% ------------------------------------------------------------------ loop [15] 100.0% [24] 612(1.2%) 0(0.0%) andmap ...0/collects/racket/private/map.rkt:102:13 ordinary-value? [77] 100.0% ------------------------------------------------------------------ eval-prog [19] 9.1% gf [18] 45.5% loop [25] 45.5% [25] 334(0.7%) 334(0.7%) loop (unknown source) loop [25] 45.5% gf [18] 36.4% expand-capturing-lifts [3] 9.1% ------------------------------------------------------------------ ??? [20] 100.0% [26] 29516(58.7%) 0(0.0%) for-loop ...bie/develop/src/core/simplify.rkt:33:2 one-iter [29] 100.0% ------------------------------------------------------------------ ??? [20] 100.0% [27] 2070(4.1%) 0(0.0%) loop ...herbie/develop/src/core/simplify.rkt:142:2 for-loop [30] 100.0% ------------------------------------------------------------------ ulp-difference [23] 100.0% [28] 668(1.3%) 332(0.7%) infer-representation ...develop/src/float.rkt:15:0 return/no-unsupplied [107] 50.3% ------------------------------------------------------------------ ??? [20] 1.0% for-loop [26] 99.0% [29] 29808(59.2%) 0(0.0%) one-iter ...bie/develop/src/core/simplify.rkt:85:0 for-loop [31] 79.2% find-matches [32] 20.8% ------------------------------------------------------------------ loop [27] 100.0% [30] 2070(4.1%) 0(0.0%) for-loop ...ie/develop/src/core/simplify.rkt:148:4 loop [33] 33.1% expression-cost [34] 32.0% for-loop [35] 17.5% argmin [36] 17.4% ------------------------------------------------------------------ one-iter [29] 100.0% [31] 23600(46.9%) 0(0.0%) for-loop ...bie/develop/src/core/simplify.rkt:94:2 loop [37] 98.7% reduce-to-single! [42] 1.3% ------------------------------------------------------------------ one-iter [29] 100.0% [32] 6208(12.3%) 0(0.0%) find-matches ...develop/src/core/simplify.rkt:55:0 for-loop [38] 100.0% ------------------------------------------------------------------ for-loop [30] 100.0% [33] 686(1.4%) 0(0.0%) loop .../racket-7.0/collects/racket/list.rkt:751:4 for-loop [39] 100.0% ------------------------------------------------------------------ for-loop [30] 100.0% [34] 662(1.3%) 0(0.0%) expression-cost .../develop/src/programs.rkt:157:0 compile [40] 100.0% ------------------------------------------------------------------ for-loop [30] 100.0% [35] 362(0.7%) 0(0.0%) for-loop ...e/develop/src/core/simplify.rkt:152:16 for-loop [41] 100.0% ------------------------------------------------------------------ for-loop [30] 100.0% [36] 360(0.7%) 0(0.0%) argmin ...acket-7.0/collects/racket/list.rkt:765:0 for-loop [39] 100.0% ------------------------------------------------------------------ loop [37] 6.2% for-loop [31] 93.8% [37] 23300(46.3%) 0(0.0%) loop .../herbie/develop/src/core/simplify.rkt:99:4 apply-match [43] 93.8% loop [37] 6.2% ------------------------------------------------------------------ for-loop [38] 50.0% find-matches [32] 50.0% [38] 6208(12.3%) 592(1.2%) for-loop ...bie/develop/src/core/simplify.rkt:57:8 for-loop [38] 50.0% match-e [47] 45.2% ------------------------------------------------------------------ argmin [36] 34.4% loop [33] 65.6% [39] 1046(2.1%) 326(0.6%) for-loop .../herbie/develop/src/programs.rkt:158:2 table-ref [44] 68.8% ------------------------------------------------------------------ expression-cost [34] 100.0% [40] 662(1.3%) 0(0.0%) compile ...s/herbie/develop/src/programs.rkt:134:0 hash-ref! [45] 100.0% ------------------------------------------------------------------ for-loop [35] 100.0% [41] 362(0.7%) 362(0.7%) for-loop ...e/develop/src/core/simplify.rkt:156:23 ------------------------------------------------------------------ for-loop [31] 100.0% [42] 300(0.6%) 0(0.0%) reduce-to-single! ...lop/src/core/egraph.rkt:318:0 for-loop [46] 100.0% ------------------------------------------------------------------ loop [37] 100.0% [43] 23300(46.3%) 0(0.0%) apply-match .../develop/src/core/simplify.rkt:64:0 for-loop [48] 50.6% match-e [47] 37.9% set [68] 10.2% ------------------------------------------------------------------ for-loop [39] 100.0% [44] 720(1.4%) 360(0.7%) table-ref ...es/herbie/develop/src/common.rkt:41:0 for-loop [50] 50.0% ------------------------------------------------------------------ compile [40] 41.6% ??? [49] 58.4% [45] 662(1.3%) 334(0.7%) hash-ref! .../racket/private/more-scheme.rkt:376:2 ??? [49] 83.2% ------------------------------------------------------------------ reduce-to-single! [42] 100.0% [46] 300(0.6%) 0(0.0%) for-loop ...rbie/develop/src/core/egraph.rkt:319:8 constant? [54] 100.0% ------------------------------------------------------------------ for-loop [38] 28.6% apply-match [43] 34.2% for-loop [55] 37.3% [47] 14456(28.7%) 912(1.8%) match-e ...herbie/develop/src/core/ematch.rkt:39:0 for-loop [51] 82.9% variable? [53] 5.4% constant? [54] 5.0% ??? [60] 2.8% ------------------------------------------------------------------ apply-match [43] 100.0% [48] 11788(23.4%) 0(0.0%) for-loop ...bie/develop/src/core/simplify.rkt:77:2 merge-egraph-nodes! [52] 84.5% dedup-children! [67] 15.5% ------------------------------------------------------------------ hash-ref! [45] 100.0% [49] 662(1.3%) 328(0.7%) ??? ...tlies/herbie/develop/src/programs.rkt:142:5 hash-ref! [45] 75.2% ------------------------------------------------------------------ table-ref [44] 100.0% [50] 360(0.7%) 360(0.7%) for-loop ...ies/herbie/develop/src/common.rkt:43:4 ------------------------------------------------------------------ match-e [47] 100.0% [51] 13526(26.9%) 4244(8.4%) for-loop ...rbie/develop/src/core/ematch.rkt:52:11 for-loop [55] 52.4% loop [65] 17.6% foldr [61] 4.7% cp-2 [69] 2.7% cartesian-product [63] 2.2% curried [62] 1.2% foldl [78] 1.1% ------------------------------------------------------------------ merge-egraph-nodes! [52] 6.0% for-loop [58] 9.1% for-loop [48] 84.9% [52] 9956(19.8%) 0(0.0%) merge-egraph-nodes! ...p/src/core/egraph.rkt:143:0 update-leader! [56] 43.8% loop! [57] 31.2% for-loop [58] 12.1% merge-egraph-nodes! [52] 6.0% dedup-children! [67] 3.9% enode-merge! [64] 3.0% ------------------------------------------------------------------ match-e [47] 100.0% [53] 2182(4.3%) 296(0.6%) variable? ...e/develop/src/syntax/syntax.rkt:724:0 value? [59] 56.9% ??? [60] 29.5% ------------------------------------------------------------------ for-loop [46] 24.4% match-e [47] 75.6% [54] 1230(2.4%) 0(0.0%) constant? ...e/develop/src/syntax/syntax.rkt:721:0 value? [59] 100.0% ------------------------------------------------------------------ for-loop [51] 100.0% [55] 9538(19.0%) 310(0.6%) for-loop ...rbie/develop/src/core/ematch.rkt:58:37 match-e [47] 98.4% ------------------------------------------------------------------ merge-egraph-nodes! [52] 100.0% [56] 4858(9.7%) 0(0.0%) update-leader! ...evelop/src/core/egraph.rkt:211:0 for-loop [66] 93.8% custom-set-union! [70] 6.2% ------------------------------------------------------------------ loop [65] 18.0% merge-egraph-nodes! [52] 82.0% [57] 3578(7.1%) 660(1.3%) loop! ...s/herbie/develop/src/core/enode.rkt:190:2 custom-set-union [74] 58.9% loop [65] 27.6% set [68] 4.2% ------------------------------------------------------------------ merge-egraph-nodes! [52] 100.0% [58] 2480(4.9%) 0(0.0%) for-loop ...rbie/develop/src/core/egraph.rkt:197:4 merge-egraph-nodes! [52] 87.9% dedup-children! [67] 12.1% ------------------------------------------------------------------ constant? [54] 49.8% variable? [53] 50.2% [59] 2472(4.9%) 2472(4.9%) value? ...herbie/develop/src/syntax/types.rkt:18:0 ------------------------------------------------------------------ variable? [53] 34.5% match-e [47] 65.5% [60] 1864(3.7%) 1864(3.7%) ??? ...contract/private/arrow-val-first.rkt:388:18 ------------------------------------------------------------------ for-loop [51] 100.0% [61] 964(1.9%) 300(0.6%) foldr ....0/collects/racket/private/list.rkt:242:4 cp-2 [69] 68.9% ------------------------------------------------------------------ ??? [22] 48.0% for-loop [51] 52.0% [62] 646(1.3%) 646(1.3%) curried ...-7.0/collects/racket/function.rkt:71:18 ------------------------------------------------------------------ for-loop [51] 100.0% [63] 302(0.6%) 302(0.6%) cartesian-product ...ollects/racket/list.rkt:822:0 ------------------------------------------------------------------ merge-egraph-nodes! [52] 100.0% [64] 300(0.6%) 0(0.0%) enode-merge! ...e/develop/src/core/enode.rkt:127:0 adopt-enode! [71] 100.0% ------------------------------------------------------------------ loop! [57] 1.3% for-loop [51] 2.7% for-loop [17] 13.7% loop [65] 82.3% [65] 4656(9.3%) 2098(4.2%) loop ...-7.0/collects/racket/private/map.rkt:40:19 loop [65] 82.3% ordinary-value? [77] 7.0% ??? [72] 6.7% loop! [57] 1.2% foldl [78] 0.2% ------------------------------------------------------------------ update-leader! [56] 100.0% [66] 4558(9.1%) 0(0.0%) for-loop ...rbie/develop/src/core/egraph.rkt:216:6 hash-update! [82] 59.7% for-loop [76] 40.3% ------------------------------------------------------------------ for-loop [58] 9.8% merge-egraph-nodes! [52] 30.1% for-loop [48] 60.0% [67] 3052(6.1%) 0(0.0%) dedup-children! ...evelop/src/core/enode.rkt:198:0 loop [73] 100.0% ------------------------------------------------------------------ loop! [57] 11.2% apply-match [43] 88.8% [68] 2672(5.3%) 658(1.3%) set ...collects/racket/private/set-types.rkt:981:0 for-loop [75] 75.4% ------------------------------------------------------------------ for-loop [51] 35.2% foldr [61] 64.8% [69] 1024(2.0%) 362(0.7%) cp-2 .../racket-7.0/collects/racket/list.rkt:826:2 for-loop [79] 64.6% ------------------------------------------------------------------ update-leader! [56] 100.0% [70] 300(0.6%) 0(0.0%) custom-set-union! ...t/private/set-types.rkt:245:0 for-loop [80] 100.0% ------------------------------------------------------------------ enode-merge! [64] 100.0% [71] 300(0.6%) 0(0.0%) adopt-enode! ...e/develop/src/core/enode.rkt:103:0 custom-set-union [74] 100.0% ------------------------------------------------------------------ loop [65] 2.3% for-loop [16] 2.4% ??? [7] 7.4% loop [21] 87.9% [72] 13584(27.0%) 954(1.9%) ??? ...htlies/herbie/develop/src/programs.rkt:99:2 ??? [81] 53.0% ??? [87] 40.0% ------------------------------------------------------------------ dedup-children! [67] 11.2% loop [73] 88.8% [73] 3052(6.1%) 3052(6.1%) loop ...racket-7.0/collects/racket/list.rkt:434:17 loop [73] 88.8% ------------------------------------------------------------------ adopt-enode! [71] 11.7% loop! [57] 88.3% [74] 2572(5.1%) 1312(2.6%) custom-set-union ...et/private/set-types.rkt:168:0 for-loop [84] 36.0% for-loop [86] 13.0% ------------------------------------------------------------------ set [68] 100.0% [75] 2014(4.0%) 2014(4.0%) for-loop ...cts/racket/private/set-types.rkt:937:4 ------------------------------------------------------------------ for-loop [66] 100.0% [76] 1838(3.7%) 0(0.0%) for-loop ...rbie/develop/src/core/egraph.rkt:217:8 hash-update! [82] 100.0% ------------------------------------------------------------------ loop [15] 25.8% loop [65] 25.8% andmap [24] 48.4% [77] 1264(2.5%) 312(0.6%) ordinary-value? ...rbie/develop/src/float.rkt:80:0 special-value? [83] 75.3% ------------------------------------------------------------------ for-loop [51] 32.8% loop [65] 67.2% [78] 944(1.9%) 610(1.2%) foldl ....0/collects/racket/private/list.rkt:229:4 merge2 [85] 35.4% ------------------------------------------------------------------ cp-2 [69] 100.0% [79] 662(1.3%) 662(1.3%) for-loop ...ket-7.0/collects/racket/list.rkt:827:4 ------------------------------------------------------------------ custom-set-union! [70] 100.0% [80] 300(0.6%) 300(0.6%) for-loop ...cts/racket/private/set-types.rkt:253:4 ------------------------------------------------------------------ ??? [72] 100.0% [81] 7198(14.3%) 432(0.9%) ??? ...t-7.0/collects/racket/private/kw.rkt:592:14 ??? [88] 84.5% ??? [87] 9.5% ------------------------------------------------------------------ for-loop [76] 40.3% for-loop [66] 59.7% [82] 4558(9.1%) 0(0.0%) hash-update! ...cket/private/more-scheme.rkt:365:4 ??? [89] 100.0% ------------------------------------------------------------------ ordinary-value? [77] 100.0% [83] 952(1.9%) 0(0.0%) special-value? ...erbie/develop/src/float.rkt:76:0 for-loop [90] 100.0% ------------------------------------------------------------------ custom-set-union [74] 100.0% [84] 926(1.8%) 300(0.6%) for-loop ...cts/racket/private/set-types.rkt:174:3 for-loop [91] 67.6% ------------------------------------------------------------------ foldl [78] 100.0% [85] 334(0.7%) 334(0.7%) merge2 .../herbie/develop/src/core/ematch.rkt:24:0 ------------------------------------------------------------------ custom-set-union [74] 100.0% [86] 334(0.7%) 334(0.7%) for-loop ...cts/racket/private/set-types.rkt:152:2 ------------------------------------------------------------------ ??? [7] 4.4% ??? [81] 9.2% ??? [22] 13.7% ??? [72] 72.7% [87] 7476(14.9%) 322(0.6%) ??? ...tract/private/arrow-higher-order.rkt:357:33 mk-ival [92] 63.5% ->flonum [96] 13.6% sample-multi-bounded [97] 9.4% ival-mult [100] 9.2% ------------------------------------------------------------------ ??? [81] 100.0% [88] 6080(12.1%) 0(0.0%) ??? ...tract/private/arrow-higher-order.rkt:361:33 ival-add [93] 75.1% ival-fma [95] 24.9% ------------------------------------------------------------------ hash-update! [82] 100.0% [89] 4558(9.1%) 0(0.0%) ??? ...s/herbie/develop/src/core/egraph.rkt:219:24 for-loop [94] 86.2% update-en-expr [102] 13.8% ------------------------------------------------------------------ special-value? [83] 100.0% [90] 952(1.9%) 626(1.2%) for-loop ...lies/herbie/develop/src/float.rkt:17:3 ??? [98] 34.2% ------------------------------------------------------------------ for-loop [84] 100.0% [91] 626(1.2%) 626(1.2%) for-loop ...cts/racket/private/set-types.rkt:178:5 ------------------------------------------------------------------ ??? [87] 100.0% [92] 4746(9.4%) 0(0.0%) mk-ival ...herbie/develop/src/biginterval.rkt:57:0 bf [99] 100.0% ------------------------------------------------------------------ ??? [88] 100.0% [93] 4564(9.1%) 0(0.0%) ival-add ...erbie/develop/src/biginterval.rkt:94:0 bfadd [103] 100.0% ------------------------------------------------------------------ ??? [89] 100.0% [94] 3928(7.8%) 3630(7.2%) for-loop ...bie/develop/src/core/egraph.rkt:220:26 update-en-expr [102] 7.6% ------------------------------------------------------------------ ??? [88] 100.0% [95] 1516(3.0%) 0(0.0%) ival-fma ...rbie/develop/src/biginterval.rkt:261:0 bfadd [103] 60.6% ival-mult [100] 39.4% ------------------------------------------------------------------ ??? [87] 100.0% [96] 1018(2.0%) 0(0.0%) ->flonum ...ies/herbie/develop/src/float.rkt:149:0 ??? [101] 100.0% ------------------------------------------------------------------ ??? [87] 100.0% [97] 704(1.4%) 296(0.6%) sample-multi-bounded ...evelop/src/points.rkt:15:0 return/no-unsupplied [107] 58.0% ------------------------------------------------------------------ for-loop [90] 100.0% [98] 326(0.6%) 326(0.6%) ??? ...s/racket/contract/private/arr-i.rkt:1252:29 ------------------------------------------------------------------ mk-ival [92] 100.0% [99] 4746(9.4%) 0(0.0%) bf ...ath-lib/math/private/bigfloat/mpfr.rkt:601:2 new-mpfr [105] 92.4% ??? [106] 7.6% ------------------------------------------------------------------ ival-fma [95] 46.6% ??? [87] 53.4% [100] 1284(2.6%) 688(1.4%) ival-mult ...bie/develop/src/biginterval.rkt:112:0 bfadd [103] 46.4% ------------------------------------------------------------------ ->flonum [96] 100.0% [101] 1018(2.0%) 0(0.0%) ??? ...nightlies/herbie/develop/src/float.rkt:23:2 for-loop [104] 100.0% ------------------------------------------------------------------ for-loop [94] 32.1% ??? [89] 67.9% [102] 928(1.8%) 928(1.8%) update-en-expr ...evelop/src/core/egraph.rkt:205:0 ------------------------------------------------------------------ ival-mult [100] 9.8% ival-fma [95] 15.1% ival-add [93] 75.1% [103] 6078(12.1%) 296(0.6%) bfadd ...-lib/math/private/bigfloat/mpfr.rkt:821:4 new-mpfr [105] 52.4% ??? [106] 42.8% ------------------------------------------------------------------ ??? [101] 100.0% [104] 1018(2.0%) 300(0.6%) for-loop ...lies/herbie/develop/src/float.rkt:24:5 return/no-unsupplied [107] 70.5% ------------------------------------------------------------------ bfadd [103] 42.1% bf [99] 57.9% [105] 7566(15.0%) 7566(15.0%) new-mpfr ...b/math/private/bigfloat/mpfr.rkt:335:0 ------------------------------------------------------------------ bf [99] 10.1% loop [21] 17.3% bfadd [103] 72.6% [106] 3580(7.1%) 3580(7.1%) ??? /opt/racket-7.0/collects/ffi/unsafe.rkt:898:4 ------------------------------------------------------------------ infer-representation [28] 23.0% sample-multi-bounded [97] 27.9% for-loop [104] 49.1% [107] 1462(2.9%) 1462(2.9%) return/no-unsupplied ...ct/private/arr-i.rkt:534:0 ------------------------------------------------------------------