Profiling results ----------------- Total cpu time observed: 7756ms (out of 7956ms) Number of samples taken: 38 (once every 204ms) ======================================================================== Caller Idx Total Self Name+src Local% ms(pct) ms(pct) Callee ======================================================================== [1] 7756(100.0%) 0(0.0%) ??? ...lects/racket/private/more-scheme.rkt:261:28 profile-thunk16 [6] 100.0% ------------------------------------------------------------------------ ??? [57] 100.0% [2] 1662(21.4%) 0(0.0%) approximate9 ...better-rr/src/core/taylor.rkt:11:0 loop [7] 85.0% f40 [9] 15.0% ------------------------------------------------------------------------ taylor-invert [61] 26.9% hash-ref! [45] 73.1% [3] 824(10.6%) 0(0.0%) parse-loop74 (unknown source) eval-const-expr [8] 100.0% ------------------------------------------------------------------------ hash-ref! [45] 100.0% [4] 218(2.8%) 0(0.0%) ??? ...herbie/better-rr/src/core/taylor.rkt:300:23 for-loop [10] 100.0% ------------------------------------------------------------------------ hash-ref! [45] 100.0% [5] 200(2.6%) 0(0.0%) ??? ...herbie/better-rr/src/core/taylor.rkt:290:26 for-loop [11] 100.0% ------------------------------------------------------------------------ ??? [1] 100.0% [6] 7756(100.0%) 0(0.0%) profile-thunk16 ...e/pkgs/profile-lib/main.rkt:9:0 run [12] 100.0% ------------------------------------------------------------------------ approximate9 [2] 100.0% [7] 1412(18.2%) 0(0.0%) loop .../herbie/better-rr/src/core/taylor.rkt:86:4 hash-ref! [45] 100.0% ------------------------------------------------------------------------ f61 [62] 20.2% parse-loop74 [3] 79.8% [8] 1032(13.3%) 0(0.0%) eval-const-expr ...etter-rr/src/programs.rkt:144:0 temp85_0 [66] 59.1% loop [98] 40.9% ------------------------------------------------------------------------ map [60] 50.0% approximate9 [2] 50.0% [9] 250(3.2%) 0(0.0%) f40 (unknown source) map [60] 100.0% ------------------------------------------------------------------------ ??? [4] 100.0% [10] 218(2.8%) 0(0.0%) for-loop ...e/better-rr/src/core/taylor.rkt:303:27 hash-ref! [45] 100.0% ------------------------------------------------------------------------ ??? [5] 100.0% [11] 200(2.6%) 0(0.0%) for-loop ...e/better-rr/src/core/taylor.rkt:290:52 ??? [13] 100.0% ------------------------------------------------------------------------ profile-thunk16 [6] 100.0% [12] 7756(100.0%) 0(0.0%) run ...et-7.5/share/pkgs/profile-lib/main.rkt:39:2 .../more-scheme.rkt:261:28 [14] 100.0% ------------------------------------------------------------------------ for-loop [11] 100.0% [13] 200(2.6%) 0(0.0%) ??? ...herbie/better-rr/src/core/taylor.rkt:293:19 hash-ref! [45] 100.0% ------------------------------------------------------------------------ for-loop [67] 2.6% run [12] 97.4% [14] 7756(100.0%) 200(2.6%) .../more-scheme.rkt:261:28 (unknown source) run-improve47 [15] 43.8% prepare-points-intervals [16] 35.6% oracle-error [17] 5.2% get-final-combination [18] 5.2% errors [59] 5.0% eval-errors [19] 2.6% ??? [68] 1.3% ------------------------------------------------------------------------ .../more-scheme.rkt:261:28 [14] 100.0% [15] 3394(43.8%) 0(0.0%) run-improve47 .../better-rr/src/mainloop.rkt:364:0 for-loop [20] 93.6% simplify! [31] 6.4% ------------------------------------------------------------------------ .../more-scheme.rkt:261:28 [14] 100.0% [16] 2764(35.6%) 0(0.0%) prepare-points-intervals ...r/src/points.rkt:122:0 loop [21] 100.0% ------------------------------------------------------------------------ .../more-scheme.rkt:261:28 [14] 100.0% [17] 406(5.2%) 0(0.0%) oracle-error ...bie/better-rr/src/points.rkt:179:0 for-loop [22] 100.0% ------------------------------------------------------------------------ .../more-scheme.rkt:261:28 [14] 100.0% [18] 402(5.2%) 0(0.0%) get-final-combination ...rr/src/mainloop.rkt:389:0 infer-splitpoints [23] 100.0% ------------------------------------------------------------------------ .../more-scheme.rkt:261:28 [14] 100.0% [19] 200(2.6%) 0(0.0%) eval-errors ...rbie/better-rr/src/points.rkt:170:0 for-loop [24] 100.0% ------------------------------------------------------------------------ run-improve47 [15] 100.0% [20] 3178(41.0%) 0(0.0%) for-loop ...erbie/better-rr/src/mainloop.rkt:383:4 run-iter! [25] 100.0% ------------------------------------------------------------------------ prepare-points-intervals [16] 100.0% [21] 2764(35.6%) 0(0.0%) loop ...lies/herbie/better-rr/src/points.rkt:134:4 loop [26] 57.2% ??? [27] 42.8% ------------------------------------------------------------------------ oracle-error [17] 100.0% [22] 406(5.2%) 0(0.0%) for-loop .../herbie/better-rr/src/points.rkt:180:2 loop [98] 100.0% ------------------------------------------------------------------------ get-final-combination [18] 100.0% [23] 402(5.2%) 0(0.0%) infer-splitpoints ...-rr/src/core/regimes.rkt:33:0 for-loop [28] 100.0% ------------------------------------------------------------------------ eval-errors [19] 100.0% [24] 200(2.6%) 0(0.0%) for-loop .../herbie/better-rr/src/points.rkt:172:2 ??? [29] 100.0% ------------------------------------------------------------------------ for-loop [20] 100.0% [25] 3178(41.0%) 0(0.0%) run-iter! ...rbie/better-rr/src/mainloop.rkt:345:0 gen-series! [30] 52.3% simplify! [31] 28.8% finalize-iter! [33] 13.1% localize! [37] 5.8% ------------------------------------------------------------------------ loop [21] 100.0% [26] 1582(20.4%) 194(2.5%) loop ...tlies/herbie/better-rr/src/points.rkt:79:2 ??? [32] 37.7% real->precision [34] 25.7% ??? [57] 24.4% ------------------------------------------------------------------------ loop [21] 100.0% [27] 1182(15.2%) 0(0.0%) ??? ...tlies/herbie/better-rr/src/points.rkt:115:6 sample-multi-bounded [99] 50.8% loop [98] 49.2% ------------------------------------------------------------------------ infer-splitpoints [23] 100.0% [28] 402(5.2%) 0(0.0%) for-loop ...ie/better-rr/src/core/regimes.rkt:45:6 option-on-expr [35] 100.0% ------------------------------------------------------------------------ for-loop [24] 100.0% [29] 200(2.6%) 0(0.0%) ??? ...rbie/better-rr/src/syntax/syntax.rkt:214:17 return/no-unsupplied [36] 100.0% ------------------------------------------------------------------------ run-iter! [25] 100.0% [30] 1662(21.4%) 0(0.0%) gen-series! ...ie/better-rr/src/mainloop.rkt:159:0 for-loop [38] 100.0% ------------------------------------------------------------------------ run-improve47 [15] 19.1% run-iter! [25] 80.9% [31] 1132(14.6%) 0(0.0%) simplify! ...rbie/better-rr/src/mainloop.rkt:223:0 ??? [39] 100.0% ------------------------------------------------------------------------ loop [26] 100.0% [32] 596(7.7%) 0(0.0%) ??? ...tract/private/arrow-higher-order.rkt:379:33 ival-sub [40] 100.0% ------------------------------------------------------------------------ run-iter! [25] 100.0% [33] 416(5.4%) 0(0.0%) finalize-iter! ...better-rr/src/mainloop.rkt:277:0 ??? [41] 100.0% ------------------------------------------------------------------------ loop [26] 100.0% [34] 406(5.2%) 0(0.0%) real->precision ...tter-rr/src/programs.rkt:118:11 ??? [57] 100.0% ------------------------------------------------------------------------ for-loop [28] 100.0% [35] 402(5.2%) 0(0.0%) option-on-expr ...er-rr/src/core/regimes.rkt:124:0 err-lsts->split-indices [42] 100.0% ------------------------------------------------------------------------ ??? [29] 100.0% [36] 200(2.6%) 200(2.6%) return/no-unsupplied ...ct/private/arr-i.rkt:566:0 ------------------------------------------------------------------------ run-iter! [25] 100.0% [37] 184(2.4%) 0(0.0%) localize! ...rbie/better-rr/src/mainloop.rkt:126:0 localize-error [43] 100.0% ------------------------------------------------------------------------ gen-series! [30] 100.0% [38] 1662(21.4%) 0(0.0%) for-loop ...erbie/better-rr/src/mainloop.rkt:166:7 taylor-alt [44] 100.0% ------------------------------------------------------------------------ simplify! [31] 100.0% [39] 1132(14.6%) 0(0.0%) ??? ...herbie/better-rr/src/core/simplify.rkt:42:0 egraph-run [46] 100.0% ------------------------------------------------------------------------ ??? [32] 100.0% [40] 596(7.7%) 0(0.0%) ival-sub ...ie/better-rr/src/biginterval.rkt:117:0 bfsub [78] 100.0% ------------------------------------------------------------------------ finalize-iter! [33] 100.0% [41] 416(5.4%) 0(0.0%) ??? ...contract/private/arrow-val-first.rkt:486:18 for-loop [47] 100.0% ------------------------------------------------------------------------ option-on-expr [35] 100.0% [42] 402(5.2%) 0(0.0%) err-lsts->split-indices .../core/regimes.rkt:263:0 loop [48] 100.0% ------------------------------------------------------------------------ localize! [37] 100.0% [43] 184(2.4%) 0(0.0%) localize-error ...er-rr/src/core/localize.rkt:57:0 hash-ref! [45] 100.0% ------------------------------------------------------------------------ for-loop [38] 100.0% [44] 1662(21.4%) 0(0.0%) taylor-alt ...bie/better-rr/src/mainloop.rkt:145:0 for-loop [49] 100.0% ------------------------------------------------------------------------ ??? [13] 1.8% for-loop [10] 2.7% localize-error [43] 2.9% ??? [52] 8.4% map [60] 8.6% ??? [50] 25.1% ??? [57] 25.3% loop [7] 25.3% [45] 1596(20.6%) 0(0.0%) hash-ref! .../racket/private/more-scheme.rkt:376:2 ??? [50] 50.3% taylor [53] 13.6% ??? [52] 11.6% parse-loop15 [56] 11.5% parse-loop74 [3] 8.4% ??? [4] 2.7% ??? [5] 1.8% ------------------------------------------------------------------------ ??? [39] 100.0% [46] 1132(14.6%) 0(0.0%) egraph-run .../pkgs/egg-herbie-linux/main.rkt:49:0 egraph-add-exprs [51] 100.0% ------------------------------------------------------------------------ ??? [41] 100.0% [47] 416(5.4%) 0(0.0%) for-loop ...better-rr/src/core/alt-table.rkt:192:2 atab-add-altn [54] 100.0% ------------------------------------------------------------------------ err-lsts->split-indices [42] 100.0% [48] 402(5.2%) 0(0.0%) loop ...erbie/better-rr/src/core/regimes.rkt:314:4 for-loop [55] 100.0% ------------------------------------------------------------------------ taylor-alt [44] 100.0% [49] 1662(21.4%) 0(0.0%) for-loop ...erbie/better-rr/src/mainloop.rkt:151:6 ??? [57] 100.0% ------------------------------------------------------------------------ hash-ref! [45] 100.0% [50] 1412(18.2%) 0(0.0%) ??? .../herbie/better-rr/src/core/taylor.rkt:67:15 ??? [57] 55.2% hash-ref! [45] 44.8% ------------------------------------------------------------------------ egraph-run [46] 100.0% [51] 1132(14.6%) 0(0.0%) egraph-add-exprs ...gg-herbie-linux/main.rkt:111:0 ??? [58] 100.0% ------------------------------------------------------------------------ hash-ref! [45] 100.0% [52] 810(10.4%) 0(0.0%) ??? .../herbie/better-rr/src/core/taylor.rkt:44:15 hash-ref! [45] 74.3% f61 [62] 25.7% ------------------------------------------------------------------------ taylor [53] 33.9% hash-ref! [45] 66.1% [53] 602(7.8%) 380(4.9%) taylor ...rbie/better-rr/src/core/taylor.rkt:169:0 taylor [53] 33.9% taylor-invert [61] 18.4% ------------------------------------------------------------------------ for-loop [47] 100.0% [54] 416(5.4%) 0(0.0%) atab-add-altn ...r-rr/src/core/alt-table.rkt:195:0 errors [59] 100.0% ------------------------------------------------------------------------ loop [48] 100.0% [55] 402(5.2%) 200(2.6%) for-loop ...e/better-rr/src/core/regimes.rkt:279:4 for-loop [63] 50.2% ------------------------------------------------------------------------ hash-ref! [45] 100.0% [56] 184(2.4%) 0(0.0%) parse-loop15 (unknown source) map [60] 100.0% ------------------------------------------------------------------------ loop [26] 15.7% real->precision [34] 16.5% ??? [50] 19.2% location-do [64] 24.3% for-loop [49] 24.3% [57] 2454(31.6%) 200(2.6%) ??? ...tract/private/arrow-higher-order.rkt:375:33 location-do [64] 24.3% approximate9 [2] 24.3% hash-ref! [45] 19.2% bf [70] 8.4% ival-div [71] 7.9% ival-mult [72] 7.8% ------------------------------------------------------------------------ egraph-add-exprs [51] 100.0% [58] 1132(14.6%) 0(0.0%) ??? ...erbie/better-rr/src/core/simplify.rkt:103:6 for-loop [65] 100.0% ------------------------------------------------------------------------ atab-add-altn [54] 41.4% .../more-scheme.rkt:261:28 [14] 58.6% [59] 1006(13.0%) 0(0.0%) errors ...es/herbie/better-rr/src/points.rkt:192:0 for-loop [67] 58.6% temp85_0 [66] 41.4% ------------------------------------------------------------------------ parse-loop15 [56] 42.4% f40 [9] 57.6% [60] 434(5.6%) 0(0.0%) map ...t-7.5/collects/racket/private/map.rkt:35:13 hash-ref! [45] 31.8% f40 [9] 28.8% simplify* [69] 28.8% loop [73] 10.6% ------------------------------------------------------------------------ taylor [53] 100.0% [61] 222(2.9%) 0(0.0%) taylor-invert ...tter-rr/src/core/taylor.rkt:317:0 parse-loop74 [3] 100.0% ------------------------------------------------------------------------ ??? [52] 100.0% [62] 208(2.7%) 0(0.0%) f61 (unknown source) eval-const-expr [8] 100.0% ------------------------------------------------------------------------ for-loop [55] 100.0% [63] 202(2.6%) 0(0.0%) for-loop ...e/better-rr/src/core/regimes.rkt:283:8 ??? [68] 100.0% ------------------------------------------------------------------------ location-do [64] 26.8% ??? [57] 73.2% [64] 1662(21.4%) 0(0.0%) location-do ...bie/better-rr/src/programs.rkt:87:0 ??? [57] 73.2% location-do [64] 26.8% ------------------------------------------------------------------------ ??? [58] 100.0% [65] 1132(14.6%) 1132(14.6%) for-loop .../better-rr/src/core/simplify.rkt:121:2 ------------------------------------------------------------------------ errors [59] 40.5% eval-const-expr [8] 59.5% [66] 1026(13.2%) 0(0.0%) temp85_0 (unknown source) compile15 [74] 100.0% ------------------------------------------------------------------------ errors [59] 100.0% [67] 590(7.6%) 192(2.5%) for-loop .../herbie/better-rr/src/points.rkt:194:2 .../more-scheme.rkt:261:28 [14] 67.5% ------------------------------------------------------------------------ .../more-scheme.rkt:261:28 [14] 49.5% for-loop [63] 50.5% [68] 400(5.2%) 400(5.2%) ??? ...cket-7.5/collects/racket/function.rkt:93:12 ------------------------------------------------------------------------ map [60] 100.0% [69] 250(3.2%) 0(0.0%) simplify* ...ie/better-rr/src/core/reduce.rkt:28:0 constant? [75] 100.0% ------------------------------------------------------------------------ ??? [57] 100.0% [70] 206(2.7%) 0(0.0%) bf ...ath-lib/math/private/bigfloat/mpfr.rkt:615:2 ??? [81] 100.0% ------------------------------------------------------------------------ ??? [57] 100.0% [71] 194(2.5%) 194(2.5%) ival-div ...ie/better-rr/src/biginterval.rkt:149:0 ------------------------------------------------------------------------ ??? [57] 100.0% [72] 192(2.5%) 0(0.0%) ival-mult ...e/better-rr/src/biginterval.rkt:129:0 bfsub [78] 100.0% ------------------------------------------------------------------------ map [60] 2.2% loop [73] 97.8% [73] 184(2.4%) 0(0.0%) loop ...-7.5/collects/racket/private/map.rkt:40:19 loop [73] 97.8% ??? [76] 2.2% ------------------------------------------------------------------------ temp85_0 [66] 100.0% [74] 1026(13.2%) 0(0.0%) compile15 (unknown source) temp91_0 [77] 100.0% ------------------------------------------------------------------------ simplify* [69] 100.0% [75] 250(3.2%) 0(0.0%) constant? ...better-rr/src/syntax/syntax.rkt:726:0 value? [79] 100.0% ------------------------------------------------------------------------ loop [73] 100.0% [76] 184(2.4%) 0(0.0%) ??? ...-racket/utils/simple-result-arrow.rkt:39:12 bfsub [78] 100.0% ------------------------------------------------------------------------ compile15 [74] 100.0% [77] 1026(13.2%) 0(0.0%) temp91_0 (unknown source) temp118_0 [80] 100.0% ------------------------------------------------------------------------ ??? [76] 18.9% ival-mult [72] 19.8% ival-sub [40] 61.3% [78] 972(12.5%) 0(0.0%) bfsub ...-lib/math/private/bigfloat/mpfr.rkt:835:4 new-mpfr [82] 59.9% ??? [81] 40.1% ------------------------------------------------------------------------ constant? [75] 100.0% [79] 250(3.2%) 250(3.2%) value? ...rbie/better-rr/src/syntax/types.rkt:18:0 ------------------------------------------------------------------------ temp91_0 [77] 100.0% [80] 1026(13.2%) 0(0.0%) temp118_0 (unknown source) expand-capturing-lifts [83] 100.0% ------------------------------------------------------------------------ bf [70] 34.6% bfsub [78] 65.4% [81] 596(7.7%) 596(7.7%) ??? /opt/racket-7.5/collects/ffi/unsafe.rkt:938:4 ------------------------------------------------------------------------ bfsub [78] 100.0% [82] 582(7.5%) 582(7.5%) new-mpfr ...b/math/private/bigfloat/mpfr.rkt:348:0 ------------------------------------------------------------------------ loop [98] 29.1% temp118_0 [80] 70.9% [83] 1448(18.7%) 0(0.0%) expand-capturing-lifts (unknown source) lambda-clause-expander [84] 55.8% loop [98] 15.3% expand-id-application-form17 [86] 15.1% dispatch-transformer41 [85] 13.8% ------------------------------------------------------------------------ expand-capturing-lifts [83] 100.0% [84] 808(10.4%) 0(0.0%) lambda-clause-expander (unknown source) finish-bodys [87] 100.0% ------------------------------------------------------------------------ expand-capturing-lifts [83] 32.8% for-loop [89] 67.2% [85] 610(7.9%) 0(0.0%) dispatch-transformer41 (unknown source) apply-transformer52 [88] 100.0% ------------------------------------------------------------------------ expand-capturing-lifts [83] 100.0% [86] 218(2.8%) 0(0.0%) expand-id-application-form17 (unknown source) syntax-e/no-taint [95] 100.0% ------------------------------------------------------------------------ for-loop [89] 36.8% lambda-clause-expander [84] 63.2% [87] 808(10.4%) 0(0.0%) finish-bodys (unknown source) for-loop [89] 100.0% ------------------------------------------------------------------------ dispatch-transformer41 [85] 100.0% [88] 610(7.9%) 0(0.0%) apply-transformer52 (unknown source) apply-transformer-in-context [90] 67.2% apply-post-expansion [91] 32.8% ------------------------------------------------------------------------ for-loop [89] 43.8% finish-bodys [87] 56.2% [89] 808(10.4%) 0(0.0%) for-loop (unknown source) for-loop [89] 43.8% finish-bodys [87] 21.5% dispatch-transformer41 [85] 16.9% syntax-e [92] 13.2% add-local-binding!39 [94] 4.6% ------------------------------------------------------------------------ apply-transformer52 [88] 100.0% [90] 410(5.3%) 0(0.0%) apply-transformer-in-context (unknown source) ??? [93] 100.0% ------------------------------------------------------------------------ apply-transformer52 [88] 100.0% [91] 200(2.6%) 0(0.0%) apply-post-expansion (unknown source) gf [100] 100.0% ------------------------------------------------------------------------ loop [98] 49.3% for-loop [89] 50.7% [92] 422(5.4%) 0(0.0%) syntax-e (unknown source) syntax-e/no-taint [95] 100.0% ------------------------------------------------------------------------ apply-transformer-in-context [90]100.0% [93] 410(5.3%) 0(0.0%) ??? ...collects/racket/private/qq-and-or.rkt:155:9 ??? [96] 100.0% ------------------------------------------------------------------------ for-loop [89] 100.0% [94] 184(2.4%) 184(2.4%) add-local-binding!39 (unknown source) ------------------------------------------------------------------------ expand-id-application-form17 [86] 34.1% syntax-e [92] 65.9% [95] 640(8.3%) 0(0.0%) syntax-e/no-taint (unknown source) loop [98] 100.0% ------------------------------------------------------------------------ ??? [93] 100.0% [96] 410(5.3%) 202(2.6%) ??? ...ollects/racket/private/qq-and-or.rkt:164:21 syntax->list [97] 50.7% ------------------------------------------------------------------------ ??? [96] 100.0% [97] 208(2.7%) 0(0.0%) syntax->list (unknown source) loop [98] 100.0% ------------------------------------------------------------------------ syntax->list [97] 5.1% expand-capturing-lifts [83] 5.4% eval-const-expr [8] 6.3% gf [100] 7.1% loop [98] 11.5% ??? [27] 18.7% for-loop [22] 19.8% syntax-e/no-taint [95] 26.1% [98] 2050(26.4%) 422(5.4%) loop (unknown source) gf [100] 32.4% ??? [101] 19.8% sample-multi-bounded [99] 18.7% loop [98] 11.5% expand-capturing-lifts [83] 6.3% syntax-e [92] 5.1% ------------------------------------------------------------------------ loop [98] 49.2% ??? [27] 50.8% [99] 1182(15.2%) 400(5.2%) sample-multi-bounded ...ter-rr/src/points.rkt:14:0 random-ranges [102] 66.2% ------------------------------------------------------------------------ apply-post-expansion [91] 3.0% loop [98] 97.0% [100] 840(10.8%) 218(2.8%) gf (unknown source) cache-or-reuse-hash [103] 25.5% propagation-apply [104] 24.8% loop [98] 23.8% ------------------------------------------------------------------------ loop [98] 100.0% [101] 406(5.2%) 406(5.2%) ??? ...lies/herbie/better-rr/src/points.rkt:181:26 ------------------------------------------------------------------------ sample-multi-bounded [99] 100.0% [102] 782(10.1%) 382(4.9%) random-ranges ...ie/better-rr/src/common.rkt:164:0 cons/c [105] 51.2% ------------------------------------------------------------------------ gf [100] 100.0% [103] 214(2.8%) 214(2.8%) cache-or-reuse-hash (unknown source) ------------------------------------------------------------------------ gf [100] 100.0% [104] 208(2.7%) 208(2.7%) propagation-apply (unknown source) ------------------------------------------------------------------------ random-ranges [102] 100.0% [105] 400(5.2%) 0(0.0%) cons/c .../racket/contract/private/guts.rkt:500:15 coerce-contract [106] 100.0% ------------------------------------------------------------------------ cons/c [105] 100.0% [106] 400(5.2%) 0(0.0%) coerce-contract ...contract/private/guts.rkt:307:0 coerce-contract/f [107] 100.0% ------------------------------------------------------------------------ coerce-contract [106] 100.0% [107] 400(5.2%) 0(0.0%) coerce-contract/f ...ntract/private/guts.rkt:372:0 coerce-simple-value [108] 100.0% ------------------------------------------------------------------------ coerce-contract/f [107] 100.0% [108] 400(5.2%) 400(5.2%) coerce-simple-value ...ract/private/guts.rkt:385:0 ------------------------------------------------------------------------