Profiling results ----------------- Total cpu time observed: 21154ms (out of 21364ms) Number of samples taken: 102 (once every 207ms) (Hiding functions with self<1.0% and local<2.0%: 2 of 108 hidden) ======================================================================= Caller Idx Total Self Name+src Local% ms(pct) ms(pct) Callee ======================================================================= [1] 21154(100.0%) 0(0.0%) ??? ...lects/racket/private/more-scheme.rkt:261:28 profile-thunk16 [4] 100.0% ----------------------------------------------------------------------- matcher [67] 100.0% [2] 434(2.1%) 0(0.0%) ??? ...aster-eval-prog/src/core/matcher.rkt:127:11 for-loop [5] 100.0% ----------------------------------------------------------------------- ??? [85] 100.0% [3] 224(1.1%) 0(0.0%) variable? ...eval-prog/src/syntax/syntax.rkt:729:0 ??? [89] 100.0% ----------------------------------------------------------------------- ??? [1] 100.0% [4] 21154(100.0%) 0(0.0%) profile-thunk16 ...e/pkgs/profile-lib/main.rkt:9:0 run [6] 100.0% ----------------------------------------------------------------------- ??? [2] 100.0% [5] 434(2.1%) 0(0.0%) for-loop ...-eval-prog/src/core/matcher.rkt:129:15 matcher [67] 100.0% ----------------------------------------------------------------------- profile-thunk16 [4] 100.0% [6] 21154(100.0%) 0(0.0%) run ...et-7.5/share/pkgs/profile-lib/main.rkt:39:2 .../more-scheme.rkt:261:28 [7] 100.0% ----------------------------------------------------------------------- for-loop [105] 24.5% run [6] 75.5% [7] 21154(100.0%) 200(0.9%) .../more-scheme.rkt:261:28 (unknown source) run-improve47 [8] 26.9% oracle-error [9] 25.9% ??? [72] 23.1% prepare-points-intervals [10] 9.5% errors [103] 5.7% get-final-combination [11] 3.8% eval-errors [66] 2.8% baseline-error [12] 0.9% ??? [79] 0.5% ----------------------------------------------------------------------- .../more-scheme.rkt:261:28 [7] 100.0% [8] 9248(43.7%) 0(0.0%) run-improve47 ...-eval-prog/src/mainloop.rkt:346:0 for-loop [13] 100.0% ----------------------------------------------------------------------- .../more-scheme.rkt:261:28 [7] 100.0% [9] 5474(25.9%) 0(0.0%) oracle-error ...ter-eval-prog/src/points.rkt:177:0 for-loop [14] 100.0% ----------------------------------------------------------------------- .../more-scheme.rkt:261:28 [7] 100.0% [10] 2014(9.5%) 0(0.0%) prepare-points-intervals ...g/src/points.rkt:120:0 loop [15] 100.0% ----------------------------------------------------------------------- .../more-scheme.rkt:261:28 [7] 100.0% [11] 1204(5.7%) 0(0.0%) get-final-combination ...og/src/mainloop.rkt:371:0 infer-splitpoints [16] 100.0% ----------------------------------------------------------------------- .../more-scheme.rkt:261:28 [7] 100.0% [12] 200(0.9%) 0(0.0%) baseline-error ...r-eval-prog/src/points.rkt:181:0 argmin [53] 100.0% ----------------------------------------------------------------------- run-improve47 [8] 100.0% [13] 9248(43.7%) 0(0.0%) for-loop ...aster-eval-prog/src/mainloop.rkt:365:4 run-iter! [17] 100.0% ----------------------------------------------------------------------- oracle-error [9] 100.0% [14] 5474(25.9%) 0(0.0%) for-loop .../faster-eval-prog/src/points.rkt:178:2 loop [18] 55.2% map [19] 44.8% ----------------------------------------------------------------------- prepare-points-intervals [10] 100.0% [15] 2014(9.5%) 0(0.0%) loop ...rbie/faster-eval-prog/src/points.rkt:132:4 loop [20] 89.8% ??? [22] 10.2% ----------------------------------------------------------------------- get-final-combination [11] 100.0% [16] 1204(5.7%) 0(0.0%) infer-splitpoints ...rog/src/core/regimes.rkt:33:0 for-loop [21] 100.0% ----------------------------------------------------------------------- for-loop [13] 100.0% [17] 9248(43.7%) 0(0.0%) run-iter! ...ster-eval-prog/src/mainloop.rkt:327:0 finalize-iter! [23] 75.0% simplify! [26] 11.5% gen-rewrites! [27] 4.7% choose-best-alt! [28] 4.3% gen-series! [29] 2.2% localize! [31] 2.2% ----------------------------------------------------------------------- loop [18] 30.2% for-loop [14] 69.8% [18] 3022(14.3%) 0(0.0%) loop (unknown source) ??? [32] 64.3% loop [18] 30.2% ??? [72] 5.5% ----------------------------------------------------------------------- parse-loop15 [88] 7.6% for-loop [14] 92.4% [19] 2654(12.5%) 0(0.0%) map ...t-7.5/collects/racket/private/map.rkt:35:13 loop [24] 48.8% ??? [32] 46.1% hash-ref! [84] 5.1% ----------------------------------------------------------------------- loop [15] 100.0% [20] 1808(8.5%) 0(0.0%) loop ...erbie/faster-eval-prog/src/points.rkt:79:2 ??? [72] 100.0% ----------------------------------------------------------------------- infer-splitpoints [16] 100.0% [21] 1204(5.7%) 0(0.0%) for-loop ...er-eval-prog/src/core/regimes.rkt:45:6 option-on-expr [25] 100.0% ----------------------------------------------------------------------- loop [15] 100.0% [22] 206(1.0%) 0(0.0%) ??? ...erbie/faster-eval-prog/src/points.rkt:113:6 sample-multi-bounded [30] 100.0% ----------------------------------------------------------------------- run-iter! [17] 100.0% [23] 6936(32.8%) 0(0.0%) finalize-iter! ...eval-prog/src/mainloop.rkt:278:0 ??? [89] 100.0% ----------------------------------------------------------------------- loop [24] 13.8% map [19] 86.2% [24] 1430(6.8%) 0(0.0%) loop ...-7.5/collects/racket/private/map.rkt:40:19 ??? [32] 85.9% loop [24] 13.8% ??? [39] 0.3% ----------------------------------------------------------------------- for-loop [21] 100.0% [25] 1204(5.7%) 0(0.0%) option-on-expr ...-prog/src/core/regimes.rkt:124:0 for-loop [34] 66.8% err-lsts->split-indices [41] 16.6% sort-context-on-expr [42] 16.6% ----------------------------------------------------------------------- run-iter! [17] 100.0% [26] 1068(5.0%) 0(0.0%) simplify! ...ster-eval-prog/src/mainloop.rkt:224:0 ??? [33] 100.0% ----------------------------------------------------------------------- run-iter! [17] 100.0% [27] 434(2.1%) 0(0.0%) gen-rewrites! ...-eval-prog/src/mainloop.rkt:183:0 for-loop [35] 100.0% ----------------------------------------------------------------------- run-iter! [17] 100.0% [28] 400(1.9%) 0(0.0%) choose-best-alt! ...al-prog/src/mainloop.rkt:117:0 ...ow-val-first.rkt:486:18 [36]100.0% ----------------------------------------------------------------------- run-iter! [17] 100.0% [29] 208(1.0%) 0(0.0%) gen-series! ...er-eval-prog/src/mainloop.rkt:160:0 for-loop [37] 100.0% ----------------------------------------------------------------------- ??? [22] 100.0% [30] 206(1.0%) 0(0.0%) sample-multi-bounded ...l-prog/src/points.rkt:14:0 random-ranges [38] 100.0% ----------------------------------------------------------------------- run-iter! [17] 100.0% [31] 202(1.0%) 0(0.0%) localize! ...ster-eval-prog/src/mainloop.rkt:127:0 localize-error [40] 100.0% ----------------------------------------------------------------------- map [19] 24.1% loop [24] 24.2% loop [18] 51.7% [32] 5072(24.0%) 202(1.0%) ??? ...rbie/faster-eval-prog/src/points.rkt:179:26 ??? [72] 96.0% ----------------------------------------------------------------------- simplify! [26] 100.0% [33] 1068(5.0%) 0(0.0%) ??? ...faster-eval-prog/src/core/simplify.rkt:42:0 egraph-run [43] 100.0% ----------------------------------------------------------------------- option-on-expr [25] 100.0% [34] 804(3.8%) 0(0.0%) for-loop ...r-eval-prog/src/core/regimes.rkt:135:4 errors [103] 100.0% ----------------------------------------------------------------------- gen-rewrites! [27] 100.0% [35] 434(2.1%) 0(0.0%) for-loop ...ster-eval-prog/src/mainloop.rkt:191:11 rewrite-expression-head24 [44] 100.0% ----------------------------------------------------------------------- choose-best-alt! [28] 100.0% [36] 400(1.9%) 0(0.0%) ...ow-val-first.rkt:486:18 (unknown source) ??? [45] 100.0% ----------------------------------------------------------------------- gen-series! [29] 100.0% [37] 208(1.0%) 0(0.0%) for-loop ...aster-eval-prog/src/mainloop.rkt:167:7 taylor-alt [46] 100.0% ----------------------------------------------------------------------- sample-multi-bounded [30] 100.0% [38] 206(1.0%) 0(0.0%) random-ranges ...er-eval-prog/src/common.rkt:164:0 build--> [47] 100.0% ----------------------------------------------------------------------- loop [24] 100.0% [39] 202(1.0%) 0(0.0%) ??? ...-racket/utils/simple-result-arrow.rkt:39:12 bfdiv [48] 100.0% ----------------------------------------------------------------------- localize! [31] 100.0% [40] 202(1.0%) 0(0.0%) localize-error ...-prog/src/core/localize.rkt:58:0 hash-ref! [84] 100.0% ----------------------------------------------------------------------- option-on-expr [25] 100.0% [41] 200(0.9%) 0(0.0%) err-lsts->split-indices .../core/regimes.rkt:263:0 loop [49] 100.0% ----------------------------------------------------------------------- option-on-expr [25] 100.0% [42] 200(0.9%) 0(0.0%) sort-context-on-expr ...src/core/regimes.rkt:117:0 ??? [50] 100.0% ----------------------------------------------------------------------- ??? [33] 100.0% [43] 1068(5.0%) 0(0.0%) egraph-run .../pkgs/egg-herbie-linux/main.rkt:49:0 egraph-add-exprs [51] 100.0% ----------------------------------------------------------------------- for-loop [35] 100.0% [44] 434(2.1%) 0(0.0%) rewrite-expression-head24 ...core/matcher.rkt:85:0 rewriter [52] 100.0% ----------------------------------------------------------------------- ...ow-val-first.rkt:486:18 [36]100.0% [45] 400(1.9%) 0(0.0%) ??? ...aster-eval-prog/src/core/alt-table.rkt:49:0 argmin [53] 50.0% loop [58] 50.0% ----------------------------------------------------------------------- for-loop [37] 100.0% [46] 208(1.0%) 0(0.0%) taylor-alt ...ter-eval-prog/src/mainloop.rkt:146:0 for-loop [54] 100.0% ----------------------------------------------------------------------- random-ranges [38] 100.0% [47] 206(1.0%) 206(1.0%) build--> ...act/private/arrow-val-first.rkt:1214:0 ----------------------------------------------------------------------- ??? [39] 100.0% [48] 202(1.0%) 0(0.0%) bfdiv ...-lib/math/private/bigfloat/mpfr.rkt:835:4 ??? [55] 100.0% ----------------------------------------------------------------------- err-lsts->split-indices [41] 100.0% [49] 200(0.9%) 0(0.0%) loop ...aster-eval-prog/src/core/regimes.rkt:314:4 for-loop [56] 100.0% ----------------------------------------------------------------------- sort-context-on-expr [42] 100.0% [50] 200(0.9%) 0(0.0%) ??? ...-7.5/collects/racket/private/sort.rkt:369:3 generic-sort/key [57] 100.0% ----------------------------------------------------------------------- egraph-run [43] 100.0% [51] 1068(5.0%) 0(0.0%) egraph-add-exprs ...gg-herbie-linux/main.rkt:111:0 ??? [59] 100.0% ----------------------------------------------------------------------- matcher [67] 50.0% rewrite-expression-head24 [44] 50.0% [52] 434(2.1%) 0(0.0%) rewriter ...er-eval-prog/src/core/matcher.rkt:87:2 for-loop [60] 100.0% ----------------------------------------------------------------------- ??? [45] 50.0% baseline-error [12] 50.0% [53] 400(1.9%) 0(0.0%) argmin ...acket-7.5/collects/racket/list.rkt:765:0 ??? [64] 50.0% ??? [61] 50.0% ----------------------------------------------------------------------- taylor-alt [46] 100.0% [54] 208(1.0%) 0(0.0%) for-loop ...aster-eval-prog/src/mainloop.rkt:152:6 ??? [79] 100.0% ----------------------------------------------------------------------- bfdiv [48] 100.0% [55] 202(1.0%) 202(1.0%) ??? /opt/racket-7.5/collects/ffi/unsafe.rkt:938:4 ----------------------------------------------------------------------- loop [49] 100.0% [56] 200(0.9%) 0(0.0%) for-loop ...r-eval-prog/src/core/regimes.rkt:279:4 for-loop [62] 100.0% ----------------------------------------------------------------------- ??? [50] 100.0% [57] 200(0.9%) 0(0.0%) generic-sort/key .../racket/private/sort.rkt:156:2 copying-mergesort [63] 100.0% ----------------------------------------------------------------------- ??? [45] 100.0% [58] 200(0.9%) 0(0.0%) loop .../racket-7.5/collects/racket/list.rkt:751:4 ??? [61] 100.0% ----------------------------------------------------------------------- egraph-add-exprs [51] 100.0% [59] 1068(5.0%) 0(0.0%) ??? ...aster-eval-prog/src/core/simplify.rkt:102:6 for-loop [65] 100.0% ----------------------------------------------------------------------- rewriter [52] 100.0% [60] 434(2.1%) 0(0.0%) for-loop ...er-eval-prog/src/core/matcher.rkt:89:4 matcher [67] 76.7% for-loop [68] 23.3% ----------------------------------------------------------------------- loop [58] 50.0% argmin [53] 50.0% [61] 400(1.9%) 0(0.0%) ??? ...ie/faster-eval-prog/src/mainloop.rkt:114:10 errors [103] 100.0% ----------------------------------------------------------------------- for-loop [56] 100.0% [62] 200(0.9%) 200(0.9%) for-loop ...r-eval-prog/src/core/regimes.rkt:283:8 ----------------------------------------------------------------------- generic-sort/key [57] 25.0% copying-mergesort [63] 75.0% [63] 200(0.9%) 0(0.0%) copying-mergesort ...racket/private/sort.rkt:129:8 copying-mergesort [63] 75.0% jloop [69] 25.0% ----------------------------------------------------------------------- argmin [53] 100.0% [64] 200(0.9%) 0(0.0%) ??? ...rbie/faster-eval-prog/src/points.rkt:182:27 eval-errors [66] 100.0% ----------------------------------------------------------------------- ??? [59] 100.0% [65] 1068(5.0%) 1068(5.0%) for-loop ...-eval-prog/src/core/simplify.rkt:121:2 ----------------------------------------------------------------------- ??? [64] 24.9% .../more-scheme.rkt:261:28 [7] 75.1% [66] 802(3.8%) 0(0.0%) eval-errors ...ster-eval-prog/src/points.rkt:168:0 for-loop [70] 100.0% ----------------------------------------------------------------------- for-loop [5] 41.1% for-loop [60] 58.9% [67] 434(2.1%) 232(1.1%) matcher ...er-eval-prog/src/core/matcher.rkt:115:2 ??? [2] 41.1% rewriter [52] 41.1% ----------------------------------------------------------------------- for-loop [60] 100.0% [68] 202(1.0%) 0(0.0%) for-loop ...er-eval-prog/src/core/matcher.rkt:96:8 fix-up-variables [71] 100.0% ----------------------------------------------------------------------- copying-mergesort [63] 100.0% [69] 200(0.9%) 200(0.9%) jloop ...5/collects/racket/private/sort.rkt:120:23 ----------------------------------------------------------------------- eval-errors [66] 100.0% [70] 802(3.8%) 0(0.0%) for-loop .../faster-eval-prog/src/points.rkt:170:2 ??? [72] 100.0% ----------------------------------------------------------------------- for-loop [68] 100.0% [71] 202(1.0%) 0(0.0%) fix-up-variables ...rog/src/core/matcher.rkt:108:2 pattern-substitute [73] 100.0% ----------------------------------------------------------------------- loop [18] 2.3% for-loop [70] 4.5% loop [20] 10.1% ??? [32] 27.3% .../more-scheme.rkt:261:28 [7] 54.7% [72] 17844(84.4%) 402(1.9%) ??? ...rbie/faster-eval-prog/src/programs.rkt:97:2 hash-ref! [84] 82.1% for-loop [74] 14.6% ??? [87] 1.1% ----------------------------------------------------------------------- fix-up-variables [71] 100.0% [73] 202(1.0%) 0(0.0%) pattern-substitute ...og/src/core/matcher.rkt:45:0 do-curry [75] 100.0% ----------------------------------------------------------------------- ??? [72] 100.0% [74] 2598(12.3%) 1592(7.5%) for-loop ...aster-eval-prog/src/programs.rkt:100:6 ??? [89] 7.9% assoc-ref [76] 7.7% ??? [79] 7.7% ??? [77] 7.7% real->precision [78] 7.7% ----------------------------------------------------------------------- pattern-substitute [73] 100.0% [75] 202(1.0%) 202(1.0%) do-curry ...-7.5/collects/racket/function.rkt:71:2 ----------------------------------------------------------------------- for-loop [74] 100.0% [76] 200(0.9%) 200(0.9%) assoc-ref ...collects/racket/private/dict.rkt:56:0 ----------------------------------------------------------------------- for-loop [74] 100.0% [77] 200(0.9%) 200(0.9%) ??? ...ects/racket/contract/private/prop.rkt:301:4 ----------------------------------------------------------------------- for-loop [74] 100.0% [78] 200(0.9%) 0(0.0%) real->precision ...val-prog/src/programs.rkt:89:11 ??? [79] 100.0% ----------------------------------------------------------------------- location-do [80] 12.9% for-loop [54] 12.9% real->precision [78] 24.8% for-loop [74] 24.8% .../more-scheme.rkt:261:28 [7] 24.8% [79] 808(3.8%) 600(2.8%) ??? ...tract/private/arrow-higher-order.rkt:375:33 location-do [80] 12.9% approximate9 [81] 12.9% ----------------------------------------------------------------------- location-do [80] 50.0% ??? [79] 50.0% [80] 208(1.0%) 0(0.0%) location-do ...ter-eval-prog/src/programs.rkt:62:0 location-do [80] 50.0% ??? [79] 50.0% ----------------------------------------------------------------------- ??? [79] 100.0% [81] 208(1.0%) 0(0.0%) approximate9 ...eval-prog/src/core/taylor.rkt:11:0 taylor [82] 100.0% ----------------------------------------------------------------------- approximate9 [81] 100.0% [82] 208(1.0%) 0(0.0%) taylor ...ster-eval-prog/src/core/taylor.rkt:169:0 taylor-sqrt [83] 100.0% ----------------------------------------------------------------------- taylor [82] 100.0% [83] 208(1.0%) 0(0.0%) taylor-sqrt ...eval-prog/src/core/taylor.rkt:351:0 hash-ref! [84] 100.0% ----------------------------------------------------------------------- taylor-sqrt [83] 0.3% localize-error [40] 0.5% map [19] 0.9% ??? [72] 35.3% ??? [85] 63.1% [84] 14844(70.2%) 6172(29.2%) hash-ref! .../racket/private/more-scheme.rkt:376:2 ??? [85] 73.7% ??? [86] 6.4% ??? [87] 3.4% parse-loop15 [88] 1.4% ----------------------------------------------------------------------- hash-ref! [84] 100.0% [85] 13832(65.4%) 1584(7.5%) ??? ...ie/faster-eval-prog/src/programs.rkt:105:18 hash-ref! [84] 88.6% table-ref [91] 3.6% constant? [92] 1.5% ??? [89] 0.5% variable? [3] 0.4% ----------------------------------------------------------------------- hash-ref! [84] 100.0% [86] 3224(15.2%) 1796(8.5%) ??? ...ster-eval-prog/src/syntax/syntax.rkt:214:17 return/no-unsupplied [90] 44.3% ----------------------------------------------------------------------- ??? [72] 16.8% hash-ref! [84] 83.2% [87] 1204(5.7%) 202(1.0%) ??? ...tract/private/arrow-higher-order.rkt:379:33 ival-atan2 [93] 49.8% ??? [94] 16.8% ival-log [95] 16.6% ----------------------------------------------------------------------- hash-ref! [84] 100.0% [88] 202(1.0%) 0(0.0%) parse-loop15 (unknown source) map [19] 100.0% ----------------------------------------------------------------------- for-loop [74] 2.7% variable? [3] 3.0% ??? [85] 4.0% finalize-iter! [23] 90.4% [89] 7566(35.8%) 828(3.9%) ??? ...contract/private/arrow-val-first.rkt:486:18 for-loop [96] 85.0% atab-add-altns [98] 5.4% ----------------------------------------------------------------------- ??? [86] 100.0% [90] 1428(6.8%) 1222(5.8%) return/no-unsupplied ...ct/private/arr-i.rkt:566:0 filter [100] 14.4% ----------------------------------------------------------------------- ??? [85] 100.0% [91] 1226(5.8%) 818(3.9%) table-ref .../faster-eval-prog/src/common.rkt:33:0 dict? [99] 17.0% for-loop [101] 16.3% ----------------------------------------------------------------------- ??? [85] 100.0% [92] 812(3.8%) 0(0.0%) constant? ...eval-prog/src/syntax/syntax.rkt:726:0 value? [97] 100.0% ----------------------------------------------------------------------- ??? [87] 100.0% [93] 600(2.8%) 600(2.8%) ival-atan2 ...-eval-prog/src/biginterval.rkt:332:0 ----------------------------------------------------------------------- ??? [87] 100.0% [94] 202(1.0%) 202(1.0%) ??? ...cts/racket/contract/private/list.rkt:209:10 ----------------------------------------------------------------------- ??? [87] 100.0% [95] 200(0.9%) 200(0.9%) ival-log ...er-eval-prog/src/biginterval.rkt:202:0 ----------------------------------------------------------------------- ??? [89] 100.0% [96] 6528(30.9%) 0(0.0%) for-loop ...-eval-prog/src/core/alt-table.rkt:46:2 atab-add-altn [102] 75.9% errors [103] 24.1% ----------------------------------------------------------------------- constant? [92] 100.0% [97] 812(3.8%) 812(3.8%) value? ...ster-eval-prog/src/syntax/types.rkt:18:0 ----------------------------------------------------------------------- ??? [89] 100.0% [98] 408(1.9%) 0(0.0%) atab-add-altns ...prog/src/core/alt-table.rkt:40:0 atab-add-altn [102] 100.0% ----------------------------------------------------------------------- table-ref [91] 100.0% [99] 208(1.0%) 208(1.0%) dict? ...ollects/racket/private/generic.rkt:146:11 ----------------------------------------------------------------------- return/no-unsupplied [90] 100.0% [100] 206(1.0%) 206(1.0%) filter ...5/collects/racket/private/list.rkt:256:2 ----------------------------------------------------------------------- table-ref [91] 100.0% [101] 200(0.9%) 200(0.9%) for-loop ...e/faster-eval-prog/src/common.rkt:35:4 ----------------------------------------------------------------------- atab-add-altns [98] 7.6% for-loop [96] 92.4% [102] 5366(25.4%) 0(0.0%) atab-add-altn ...prog/src/core/alt-table.rkt:194:0 errors [103] 96.3% override-at-pnts [104] 3.7% ----------------------------------------------------------------------- ??? [61] 3.9% for-loop [34] 7.8% for-loop [96] 15.2% .../more-scheme.rkt:261:28 [7] 23.3% atab-add-altn [102] 49.9% [103] 10352(48.9%) 0(0.0%) errors ...ie/faster-eval-prog/src/points.rkt:190:0 for-loop [105] 100.0% ----------------------------------------------------------------------- atab-add-altn [102] 100.0% [104] 200(0.9%) 0(0.0%) override-at-pnts ...g/src/core/alt-table.rkt:129:0 for-loop [106] 100.0% ----------------------------------------------------------------------- errors [103] 100.0% [105] 10352(48.9%) 0(0.0%) for-loop .../faster-eval-prog/src/points.rkt:192:2 .../more-scheme.rkt:261:28 [7] 100.0% ----------------------------------------------------------------------- override-at-pnts [104] 100.0% [106] 200(0.9%) 200(0.9%) for-loop ...val-prog/src/core/alt-table.rkt:130:22 -----------------------------------------------------------------------