Profiling results ----------------- Total cpu time observed: 31458ms (out of 31984ms) Number of samples taken: 95 (once every 331ms) ======================================================================== Caller Idx Total Self Name+src Local% ms(pct) ms(pct) Callee ======================================================================== ??? [11] 100.0% [1] 31458(100.0%) 0(0.0%) profile-thunk16 ...e/pkgs/profile-lib/main.rkt:9:0 run [6] 100.0% ------------------------------------------------------------------------ ??? [11] 100.0% [2] 10676(33.9%) 0(0.0%) run-improve40 ...ie/develop/src/mainloop.rkt:340:0 for-loop [7] 93.5% loop [14] 3.3% finalize-iter! [15] 3.2% ------------------------------------------------------------------------ ??? [11] 100.0% [3] 3078(9.8%) 0(0.0%) oracle-error ...erbie/develop/src/points.rkt:212:0 for-loop [8] 100.0% ------------------------------------------------------------------------ ??? [11] 100.0% [4] 992(3.2%) 0(0.0%) get-final-combination ...op/src/mainloop.rkt:361:0 infer-splitpoints [9] 100.0% ------------------------------------------------------------------------ loop [95] 100.0% [5] 332(1.1%) 0(0.0%) expand-id-application-form17 (unknown source) syntax-e/no-taint [10] 100.0% ------------------------------------------------------------------------ profile-thunk16 [1] 100.0% [6] 31458(100.0%) 0(0.0%) run ...et-7.0/share/pkgs/profile-lib/main.rkt:39:2 ??? [11] 100.0% ------------------------------------------------------------------------ run-improve40 [2] 100.0% [7] 9982(31.7%) 0(0.0%) for-loop .../herbie/develop/src/mainloop.rkt:355:4 run-iter! [12] 100.0% ------------------------------------------------------------------------ oracle-error [3] 100.0% [8] 3078(9.8%) 0(0.0%) for-loop ...es/herbie/develop/src/points.rkt:213:2 loop [66] 69.6% map [70] 30.4% ------------------------------------------------------------------------ get-final-combination [4] 100.0% [9] 992(3.2%) 0(0.0%) infer-splitpoints ...lop/src/core/regimes.rkt:34:0 for-loop [13] 100.0% ------------------------------------------------------------------------ expand-id-application-form17 [5]100.0% [10] 332(1.1%) 0(0.0%) syntax-e/no-taint (unknown source) loop [95] 100.0% ------------------------------------------------------------------------ run [6] 50.0% [11] 31458(100.0%) 0(0.0%) ??? ...lects/racket/private/more-scheme.rkt:261:28 profile-thunk16 [1] 50.0% loop [14] 19.5% run-improve40 [2] 17.0% oracle-error [3] 4.9% eval-errors [16] 3.9% errors [46] 3.1% get-final-combination [4] 1.6% ------------------------------------------------------------------------ for-loop [7] 100.0% [12] 9982(31.7%) 0(0.0%) run-iter! ...herbie/develop/src/mainloop.rkt:321:0 finalize-iter! [15] 75.1% localize! [17] 15.3% simplify! [19] 9.6% ------------------------------------------------------------------------ infer-splitpoints [9] 100.0% [13] 992(3.2%) 0(0.0%) for-loop ...rbie/develop/src/core/regimes.rkt:46:6 option-on-expr [18] 100.0% ------------------------------------------------------------------------ run-improve40 [2] 2.8% ??? [11] 97.2% [14] 12630(40.1%) 0(0.0%) loop ...htlies/herbie/develop/src/points.rkt:303:2 loop [29] 66.8% loop [21] 27.9% make-exacts-halfpoints [26] 2.8% for-loop [28] 2.5% ------------------------------------------------------------------------ run-improve40 [2] 4.3% run-iter! [12] 95.7% [15] 7836(24.9%) 0(0.0%) finalize-iter! ...e/develop/src/mainloop.rkt:272:0 ??? [20] 100.0% ------------------------------------------------------------------------ ??? [11] 100.0% [16] 2484(7.9%) 0(0.0%) eval-errors ...herbie/develop/src/points.rkt:203:0 for-loop [22] 100.0% ------------------------------------------------------------------------ run-iter! [12] 100.0% [17] 1526(4.9%) 0(0.0%) localize! ...herbie/develop/src/mainloop.rkt:120:0 localize-error [23] 100.0% ------------------------------------------------------------------------ for-loop [13] 100.0% [18] 992(3.2%) 0(0.0%) option-on-expr ...velop/src/core/regimes.rkt:150:0 sort-context-on-expr [25] 66.3% for-loop [27] 33.7% ------------------------------------------------------------------------ run-iter! [12] 100.0% [19] 958(3.0%) 0(0.0%) simplify! ...herbie/develop/src/mainloop.rkt:217:0 ??? [24] 100.0% ------------------------------------------------------------------------ finalize-iter! [15] 100.0% [20] 7836(24.9%) 0(0.0%) ??? ...contract/private/arrow-val-first.rkt:388:18 for-loop [30] 100.0% ------------------------------------------------------------------------ loop [14] 100.0% [21] 3520(11.2%) 0(0.0%) loop ...htlies/herbie/develop/src/points.rkt:264:2 loop [29] 50.5% make-exacts-walkup [31] 49.5% ------------------------------------------------------------------------ eval-errors [16] 100.0% [22] 2484(7.9%) 0(0.0%) for-loop ...es/herbie/develop/src/points.rkt:205:2 ??? [74] 86.8% ??? [76] 13.2% ------------------------------------------------------------------------ localize! [17] 100.0% [23] 1526(4.9%) 296(0.9%) localize-error ...velop/src/core/localize.rkt:52:0 hash-ref! [56] 80.6% ------------------------------------------------------------------------ simplify! [19] 100.0% [24] 958(3.0%) 0(0.0%) ??? ...s/herbie/develop/src/core/simplify.rkt:29:0 loop [32] 100.0% ------------------------------------------------------------------------ option-on-expr [18] 100.0% [25] 658(2.1%) 0(0.0%) sort-context-on-expr ...src/core/regimes.rkt:145:0 ??? [33] 100.0% ------------------------------------------------------------------------ loop [14] 100.0% [26] 356(1.1%) 0(0.0%) make-exacts-halfpoints ...lop/src/points.rkt:262:0 loop [29] 100.0% ------------------------------------------------------------------------ option-on-expr [18] 100.0% [27] 334(1.1%) 0(0.0%) for-loop ...bie/develop/src/core/regimes.rkt:158:4 errors [46] 100.0% ------------------------------------------------------------------------ loop [14] 100.0% [28] 318(1.0%) 318(1.0%) for-loop ...s/herbie/develop/src/points.rkt:322:31 ------------------------------------------------------------------------ make-exacts-halfpoints [26] 3.4% loop [21] 16.8% loop [14] 79.8% [29] 10568(33.6%) 0(0.0%) loop ...htlies/herbie/develop/src/points.rkt:247:4 loop [66] 96.4% loop [37] 3.6% ------------------------------------------------------------------------ ??? [20] 100.0% [30] 7836(24.9%) 0(0.0%) for-loop ...ie/develop/src/core/alt-table.rkt:51:2 atab-add-altn [34] 96.2% loop [38] 3.8% ------------------------------------------------------------------------ loop [21] 100.0% [31] 1744(5.5%) 0(0.0%) make-exacts-walkup ...develop/src/points.rkt:244:0 loop [66] 100.0% ------------------------------------------------------------------------ ??? [24] 100.0% [32] 958(3.0%) 0(0.0%) loop .../herbie/develop/src/core/simplify.rkt:44:2 one-iter [35] 100.0% ------------------------------------------------------------------------ sort-context-on-expr [25] 100.0% [33] 658(2.1%) 0(0.0%) ??? ...-7.0/collects/racket/private/sort.rkt:369:3 generic-sort/key [36] 100.0% ------------------------------------------------------------------------ for-loop [30] 100.0% [34] 7538(24.0%) 0(0.0%) atab-add-altn ...elop/src/core/alt-table.rkt:200:0 best-and-tied-at-points [39] 54.5% override-at-pnts [40] 45.5% ------------------------------------------------------------------------ loop [32] 100.0% [35] 958(3.0%) 0(0.0%) one-iter ...ie/develop/src/core/simplify.rkt:100:0 find-matches [42] 66.0% for-loop [44] 34.0% ------------------------------------------------------------------------ ??? [33] 100.0% [36] 658(2.1%) 0(0.0%) generic-sort/key .../racket/private/sort.rkt:156:2 copying-mergesort [41] 100.0% ------------------------------------------------------------------------ loop [29] 100.0% [37] 376(1.2%) 0(0.0%) loop ...-7.0/collects/racket/private/map.rkt:277:4 =-or-nan? [43] 100.0% ------------------------------------------------------------------------ for-loop [30] 100.0% [38] 298(0.9%) 0(0.0%) loop ...erbie/develop/src/core/alt-table.rkt:174:2 argmax [45] 100.0% ------------------------------------------------------------------------ atab-add-altn [34] 100.0% [39] 4106(13.1%) 0(0.0%) best-and-tied-at-points ...ore/alt-table.rkt:112:0 errors [46] 91.8% for-loop [49] 8.2% ------------------------------------------------------------------------ atab-add-altn [34] 100.0% [40] 3432(10.9%) 0(0.0%) override-at-pnts ...p/src/core/alt-table.rkt:135:0 errors [46] 100.0% ------------------------------------------------------------------------ copying-mergesort [41] 33.8% generic-sort/key [36] 66.2% [41] 658(2.1%) 0(0.0%) copying-mergesort ...racket/private/sort.rkt:129:8 loop [47] 66.2% copying-mergesort [41] 33.8% ------------------------------------------------------------------------ one-iter [35] 100.0% [42] 632(2.0%) 0(0.0%) find-matches ...develop/src/core/simplify.rkt:64:0 for-loop [48] 100.0% ------------------------------------------------------------------------ loop [37] 100.0% [43] 376(1.2%) 376(1.2%) =-or-nan? ...ies/herbie/develop/src/float.rkt:76:0 ------------------------------------------------------------------------ one-iter [35] 100.0% [44] 326(1.0%) 0(0.0%) for-loop ...ie/develop/src/core/simplify.rkt:101:2 apply-match [50] 100.0% ------------------------------------------------------------------------ loop [38] 100.0% [45] 298(0.9%) 0(0.0%) argmax ...acket-7.0/collects/racket/list.rkt:766:0 expression-cost [51] 100.0% ------------------------------------------------------------------------ for-loop [27] 3.5% ??? [11] 20.6% override-at-pnts [40] 36.2% best-and-tied-at-points [39] 39.7% [46] 9488(30.2%) 0(0.0%) errors ...lies/herbie/develop/src/points.rkt:228:0 for-loop [52] 86.6% eval-prog [53] 13.4% ------------------------------------------------------------------------ copying-mergesort [41] 100.0% [47] 658(2.1%) 0(0.0%) loop ...7.0/collects/racket/private/sort.rkt:96:12 ??? [74] 100.0% ------------------------------------------------------------------------ for-loop [48] 50.0% find-matches [42] 50.0% [48] 632(2.0%) 632(2.0%) for-loop ...bie/develop/src/core/simplify.rkt:66:8 for-loop [48] 50.0% ------------------------------------------------------------------------ best-and-tied-at-points [39] 100.0% [49] 338(1.1%) 338(1.1%) for-loop .../develop/src/core/alt-table.rkt:114:16 ------------------------------------------------------------------------ for-loop [44] 100.0% [50] 326(1.0%) 0(0.0%) apply-match .../develop/src/core/simplify.rkt:73:0 for-loop [54] 100.0% ------------------------------------------------------------------------ argmax [45] 100.0% [51] 298(0.9%) 0(0.0%) expression-cost .../develop/src/programs.rkt:204:0 compile [55] 100.0% ------------------------------------------------------------------------ errors [46] 100.0% [52] 8216(26.1%) 620(2.0%) for-loop ...es/herbie/develop/src/points.rkt:230:2 ??? [74] 73.2% ??? [76] 15.3% ulp-difference [59] 3.9% ------------------------------------------------------------------------ errors [46] 100.0% [53] 1272(4.0%) 0(0.0%) eval-prog ...herbie/develop/src/programs.rkt:130:0 temp68_2 [57] 75.6% inductor [60] 24.4% ------------------------------------------------------------------------ apply-match [50] 100.0% [54] 326(1.0%) 0(0.0%) for-loop ...bie/develop/src/core/simplify.rkt:87:2 merge-egraph-nodes! [58] 100.0% ------------------------------------------------------------------------ expression-cost [51] 100.0% [55] 298(0.9%) 0(0.0%) compile ...s/herbie/develop/src/programs.rkt:181:0 hash-ref! [56] 100.0% ------------------------------------------------------------------------ map [70] 9.8% ??? [65] 9.8% compile [55] 9.8% loop [66] 25.6% localize-error [23] 45.2% [56] 1528(4.9%) 298(0.9%) hash-ref! .../racket/private/more-scheme.rkt:376:2 parse-loop15 [62] 51.1% f9 [63] 29.4% ??? [65] 9.8% ------------------------------------------------------------------------ eval-prog [53] 100.0% [57] 962(3.1%) 0(0.0%) temp68_2 (unknown source) compile16 [61] 100.0% ------------------------------------------------------------------------ for-loop [54] 100.0% [58] 326(1.0%) 0(0.0%) merge-egraph-nodes! ...p/src/core/egraph.rkt:145:0 loop! [64] 100.0% ------------------------------------------------------------------------ for-loop [52] 100.0% [59] 320(1.0%) 0(0.0%) ulp-difference ...erbie/develop/src/float.rkt:14:0 f9 [63] 100.0% ------------------------------------------------------------------------ eval-prog [53] 20.0% inductor [60] 80.0% [60] 310(1.0%) 310(1.0%) inductor .../herbie/develop/src/programs.rkt:135:4 inductor [60] 80.0% ------------------------------------------------------------------------ temp68_2 [57] 100.0% [61] 962(3.1%) 0(0.0%) compile16 (unknown source) temp74_0 [67] 100.0% ------------------------------------------------------------------------ hash-ref! [56] 100.0% [62] 930(3.0%) 0(0.0%) parse-loop15 ...s/racket/match/compiler.rkt:418:15 loop [66] 67.5% loop [68] 32.5% ------------------------------------------------------------------------ ulp-difference [59] 34.9% hash-ref! [56] 65.1% [63] 918(2.9%) 320(1.0%) f9 ....0/collects/racket/match/compiler.rkt:507:40 map [70] 65.1% ------------------------------------------------------------------------ merge-egraph-nodes! [58] 100.0% [64] 326(1.0%) 326(1.0%) loop! ...s/herbie/develop/src/core/enode.rkt:191:2 ------------------------------------------------------------------------ hash-ref! [56] 100.0% [65] 298(0.9%) 0(0.0%) ??? ...tlies/herbie/develop/src/programs.rkt:189:5 hash-ref! [56] 100.0% ------------------------------------------------------------------------ map [70] 0.1% make-exacts-walkup [31] 0.1% loop [29] 0.7% parse-loop15 [62] 4.0% for-loop [8] 12.9% loop [66] 82.2% [66] 15308(48.7%) 0(0.0%) loop ...-7.0/collects/racket/private/map.rkt:40:19 loop [66] 82.2% ??? [72] 6.0% hash-ref! [56] 4.0% ??? [74] 3.9% ??? [76] 2.5% ??? [79] 1.1% composed [69] 0.2% map [70] 0.1% ------------------------------------------------------------------------ compile16 [61] 100.0% [67] 962(3.1%) 0(0.0%) temp74_0 (unknown source) expand-single [71] 100.0% ------------------------------------------------------------------------ parse-loop15 [62] 3.1% loop [68] 96.9% [68] 604(1.9%) 0(0.0%) loop ...-7.0/collects/racket/private/map.rkt:54:19 loop [68] 96.9% ??? [76] 3.1% ------------------------------------------------------------------------ loop [66] 100.0% [69] 5750(18.3%) 358(1.1%) composed ...ollects/racket/private/list.rkt:321:16 ??? [74] 93.8% ------------------------------------------------------------------------ f9 [63] 24.1% loop [66] 25.6% for-loop [8] 50.3% [70] 1860(5.9%) 0(0.0%) map ...t-7.0/collects/racket/private/map.rkt:35:13 ??? [72] 50.3% ??? [76] 25.6% hash-ref! [56] 16.0% loop [66] 8.1% ------------------------------------------------------------------------ temp74_0 [67] 100.0% [71] 962(3.1%) 0(0.0%) expand-single (unknown source) expand-capturing-lifts [73] 100.0% ------------------------------------------------------------------------ loop [66] 49.6% map [70] 50.4% [72] 1856(5.9%) 0(0.0%) ??? ...htlies/herbie/develop/src/points.rkt:214:26 ??? [74] 82.2% ??? [76] 17.8% ------------------------------------------------------------------------ expand-single [71] 100.0% [73] 962(3.1%) 0(0.0%) expand-capturing-lifts (unknown source) lambda-clause-expander [75] 100.0% ------------------------------------------------------------------------ loop [47] 3.8% ??? [72] 8.7% loop [66] 10.0% for-loop [22] 12.3% composed [69] 30.8% for-loop [52] 34.4% [74] 17502(55.6%) 342(1.1%) ??? ...tlies/herbie/develop/src/programs.rkt:146:2 ??? [77] 50.8% ->bf [78] 27.3% ??? [76] 14.4% ??? [79] 5.5% ------------------------------------------------------------------------ expand-capturing-lifts [73] 100.0% [75] 962(3.1%) 0(0.0%) lambda-clause-expander (unknown source) finish-bodys [80] 100.0% ------------------------------------------------------------------------ for-loop [22] 3.0% ??? [72] 3.0% loop [68] 5.5% map [70] 5.7% for-loop [52] 11.5% ??? [74] 22.9% loop [66] 48.4% [76] 11000(35.0%) 710(2.3%) ??? ...tract/private/arrow-higher-order.rkt:357:33 ->flonum [81] 49.6% double->posit16 [89] 41.2% create-quire1633 [83] 2.7% ------------------------------------------------------------------------ ??? [74] 100.0% [77] 8896(28.3%) 1236(3.9%) ??? ...t-7.0/collects/racket/private/kw.rkt:592:14 create-quire1633 [83] 42.6% double->posit16 [89] 20.8% big-posit16-mul [85] 11.9% big-posit16-add [87] 4.0% posit16-neg [88] 3.3% keyword-apply [93] 3.3% ------------------------------------------------------------------------ ??? [74] 100.0% [78] 4786(15.2%) 354(1.1%) ->bf ...tlies/herbie/develop/src/programs.rkt:62:0 bf [82] 92.6% ------------------------------------------------------------------------ loop [66] 25.5% ??? [74] 74.5% [79] 1280(4.1%) 0(0.0%) ??? ...ects/racket/contract/private/prop.rkt:519:4 ??? [84] 100.0% ------------------------------------------------------------------------ lambda-clause-expander [75] 21.3% for-loop [86] 78.7% [80] 962(3.1%) 0(0.0%) finish-bodys (unknown source) for-loop [86] 100.0% ------------------------------------------------------------------------ ??? [76] 100.0% [81] 5456(17.3%) 3550(11.3%) ->flonum ...s/herbie/develop/src/programs.rkt:38:0 return/no-unsupplied [92] 12.1% list-member? [96] 6.0% ??? [97] 5.9% keyword-apply [93] 5.5% ??? [98] 5.5% ------------------------------------------------------------------------ ->bf [78] 100.0% [82] 4432(14.1%) 0(0.0%) bf ...ath-lib/math/private/bigfloat/mpfr.rkt:601:2 new-mpfr [105] 74.4% ??? [90] 25.6% ------------------------------------------------------------------------ ??? [76] 7.3% ??? [77] 92.7% [83] 4092(13.0%) 622(2.0%) create-quire1633 ...tposit-rkt/softposit.rkt:175:0 double->posit16 [89] 84.8% ------------------------------------------------------------------------ ??? [79] 100.0% [84] 1280(4.1%) 1280(4.1%) ??? ...lects/racket/contract/private/orc.rkt:83:14 ------------------------------------------------------------------------ ??? [77] 100.0% [85] 1062(3.4%) 0(0.0%) big-posit16-mul .../src/syntax/softposit.rkt:110:0 bf* [91] 100.0% ------------------------------------------------------------------------ for-loop [86] 17.7% finish-bodys [80] 82.3% [86] 962(3.1%) 0(0.0%) for-loop (unknown source) finish-bodys [80] 65.4% for-loop [86] 17.7% expand-implicit [99] 6.2% add-local-binding!37 [94] 5.8% loop [95] 4.9% ------------------------------------------------------------------------ ??? [77] 100.0% [87] 358(1.1%) 358(1.1%) big-posit16-add .../src/syntax/softposit.rkt:108:0 ------------------------------------------------------------------------ ??? [77] 100.0% [88] 298(0.9%) 298(0.9%) posit16-neg ...s/softposit-rkt/softposit.rkt:212:0 ------------------------------------------------------------------------ ??? [77] 18.8% create-quire1633 [83] 35.2% ??? [76] 46.0% [89] 9858(31.3%) 0(0.0%) double->posit16 ...ftposit-rkt/softposit.rkt:248:0 get-ffi-obj* [100] 100.0% ------------------------------------------------------------------------ bf [82] 100.0% [90] 1136(3.6%) 1136(3.6%) ??? /opt/racket-7.0/collects/ffi/unsafe.rkt:898:4 ------------------------------------------------------------------------ big-posit16-mul [85] 100.0% [91] 1062(3.4%) 0(0.0%) bf* ...ath/private/bigfloat/bigfloat-mpfr.rkt:95:0 ??? [101] 100.0% ------------------------------------------------------------------------ ->flonum [81] 100.0% [92] 660(2.1%) 334(1.1%) return/no-unsupplied ...ct/private/arr-i.rkt:534:0 filter [102] 49.4% ------------------------------------------------------------------------ ??? [77] 49.7% ->flonum [81] 50.3% [93] 596(1.9%) 596(1.9%) keyword-apply ...lects/racket/private/kw.rkt:421:2 ------------------------------------------------------------------------ for-loop [86] 100.0% [94] 334(1.1%) 334(1.1%) add-local-binding!37 (unknown source) ------------------------------------------------------------------------ syntax-e/no-taint [10] 50.0% for-loop [86] 50.0% [95] 332(1.1%) 332(1.1%) loop (unknown source) expand-id-application-form17 [5] 50.0% ------------------------------------------------------------------------ ->flonum [81] 100.0% [96] 328(1.0%) 328(1.0%) list-member? ...llects/racket/private/set.rkt:24:0 ------------------------------------------------------------------------ ->flonum [81] 100.0% [97] 320(1.0%) 320(1.0%) ??? ...-7.0/collects/racket/lazy-require.rkt:106:6 ------------------------------------------------------------------------ ->flonum [81] 100.0% [98] 298(0.9%) 298(0.9%) ??? ...s/racket/contract/private/arr-i.rkt:1252:29 ------------------------------------------------------------------------ for-loop [86] 100.0% [99] 296(0.9%) 296(0.9%) expand-implicit (unknown source) ------------------------------------------------------------------------ double->posit16 [89] 100.0% [100] 9858(31.3%) 1762(5.6%) get-ffi-obj* ...-7.0/collects/ffi/unsafe.rkt:209:2 get-ffi-lib9 [103] 82.1% ------------------------------------------------------------------------ bf* [91] 100.0% [101] 1062(3.4%) 0(0.0%) ??? ...-racket/utils/simple-result-arrow.rkt:39:12 bfmul [104] 100.0% ------------------------------------------------------------------------ return/no-unsupplied [92] 100.0% [102] 326(1.0%) 326(1.0%) filter ...0/collects/racket/private/list.rkt:256:2 ------------------------------------------------------------------------ get-ffi-obj* [100] 100.0% [103] 8096(25.7%) 4516(14.4%) get-ffi-lib9 ...-7.0/collects/ffi/unsafe.rkt:121:0 get-cross-lib-search-dirs [106] 44.2% ------------------------------------------------------------------------ ??? [101] 100.0% [104] 1062(3.4%) 0(0.0%) bfmul ...-lib/math/private/bigfloat/mpfr.rkt:821:4 new-mpfr [105] 100.0% ------------------------------------------------------------------------ bfmul [104] 24.4% bf [82] 75.6% [105] 4358(13.9%) 4358(13.9%) new-mpfr ...b/math/private/bigfloat/mpfr.rkt:335:0 ------------------------------------------------------------------------ get-ffi-lib9 [103] 100.0% [106] 3580(11.4%) 2980(9.5%) get-cross-lib-search-dirs ...rivate/dirs.rkt:168:7 ??? [107] 16.8% ------------------------------------------------------------------------ get-cross-lib-search-dirs [106] 100.0% [107] 600(1.9%) 600(1.9%) ??? ...racket-7.0/collects/racket/promise.rkt:42:2 ------------------------------------------------------------------------