\ banalyzer+ \ \ a "smarter" banalyzer class designed to works in conjunction with the \ parser classes. \ \ ob.banalyzer+ clears internal storage and stats after an ALERT: message \ is called. In addition, ob.banalyzer+ also takes into account the \ frequency of ALERT: messages and adjusts sensitivity (i.e. the alert \ threshold) accordingly. \ \ Code: Han-earl Park \ Copyright 2000 Buster & Friends C-ALTO Labs \ (Valencia, January 2000 - \ (Southampton, October 2000 - \ (Cork, March 2009 - \ \ MOD: HeP 01/25/00 Started project. \ MOD: HeP 10/18/00 Initial version of automatic tolerance setting. \ MOD: HeP 10/20/00 Load mono.parser classes first. \ MOD: HeP 10/31/00 Implement and test automatic tolerance setting. \ MOD: HeP 03-24-09 Fix bug thatprevented default iv-blyzr-tolerance-cfa from \ being set. Now set this during OPEN: include? task-mono_parser myt:mono_parser include? task-banalyzer myt:banalyzer anew task-banalyzer+ 00 constant static_tolerance 01 constant linear_tolerance 02 constant shift_tolerance 03 constant random_tolerance method PUT.TOLERANCE.MODE: method PUT.TOLERANCE.RANGE: method PUT.TOLERANCE.INCREMENT: method PUT.ALERT.WINDOW: :class OB.BANALYZER+ iv-blyzr-elm-since-alert 0 iv=> iv-blyzr-tolerance-cfa ;m :m DEFAULT: ( -- ) default: super \ 0 iv=> iv-blyzr-tolerance-incr 0 iv=> iv-blyzr-tolerance-min $ 7FFFFFFF iv=> iv-blyzr-tolerance-max \ banalyzer_max_cells iv=> iv-blyzr-alert-window \ linear_tolerance self PUT.TOLERANCE.MODE: [] ;m :m REFRESH: ( -- ) refresh: super 0 iv=> iv-blyzr-elm-since-alert ;m \ calculate tolerance : BLYZR.ALERT.LATE? ( -- flag , true if past alert window ) iv-blyzr-elm-since-alert iv-blyzr-alert-window > ; : BLYZR.ALERT.EARLY? ( -- flag , true before alert window ) iv-blyzr-elm-since-alert iv-blyzr-alert-window < ; : BLYZR.LINEAR.TOLERANCE ( n -- n' ) blyzr.alert.late? IF 1 max iv-blyzr-tolerance-incr - ELSE blyzr.alert.early? IF 1 max iv-blyzr-tolerance-incr + THEN THEN ; : BLYZR.SHIFT.TOLERANCE ( n -- n' ) blyzr.alert.late? IF iv-blyzr-tolerance-incr negate ASHIFT ELSE blyzr.alert.early? IF iv-blyzr-tolerance-incr ASHIFT THEN THEN ; : BLYZR.RANDOM.TOLERANCE ( n -- n' ) blyzr.alert.late? IF iv-blyzr-tolerance-incr choose - ELSE blyzr.alert.early? IF iv-blyzr-tolerance-incr choose + THEN THEN ; : BLYZR.CALC.TOLERANCE ( n -- n' , calculate new tolerance value ) iv-blyzr-tolerance-cfa ?dup IF 0 exec.stack? \ n -- n' iv-blyzr-tolerance-min iv-blyzr-tolerance-max clipto THEN ; : BLYZR.SET.TOLERANCE.CFA ( mode -- ) CASE static_tolerance OF 0 ENDOF linear_tolerance OF 'c blyzr.linear.tolerance ENDOF shift_tolerance OF 'c blyzr.shift.tolerance ENDOF random_tolerance OF 'c blyzr.random.tolerance ENDOF ENDCASE iv=> iv-blyzr-tolerance-cfa ; :m PUT.TOLERANCE.MODE: ( mode -- , select tolerance calculating mode ) dup 0 3 within? IF dup iv=> iv-blyzr-tolerance-mode \ iv-dev-#opened IF blyzr.set.tolerance.cfa ELSE drop THEN ELSE drop " put.tolerance.mode:" " unrecognized mode selector" THEN ;m :m PUT.TOLERANCE.INCREMENT: ( n -- , set value to be added to tolerance ) ABS iv=> iv-blyzr-tolerance-incr ;m :m PUT.TOLERANCE.RANGE: ( min max -- , set low and high tolerance limits ) over 0< over 0< OR IF 2drop " put.tolerance.range:" " tolerance cannot be a negative value" ELSE iv=> iv-blyzr-tolerance-max iv=> iv-blyzr-tolerance-min THEN ;m :m RAW.OPEN: ( -- ) raw.open: super \ iv-blyzr-tolerance-mode BLYZR.SET.TOLERANCE.CFA ;m :m PUT.ALERT.WINDOW: ( n -- ) dup 0< IF drop " put.alert.window:" " alert window size cannot be negative" ELSE iv=> iv-blyzr-alert-window THEN ;m :m RAW.ON: ( n -- ) 1 iv+> iv-blyzr-elm-since-alert \ iv-blyzr-tolerance BLYZR.CALC.TOLERANCE iv=> iv-blyzr-tolerance \ raw.on: super ;m :m ALERT: ( -- ) alert: super self REFRESH: [] ;m :m PRINT: ( -- ) print: super ." Tolerance mode = " iv-blyzr-tolerance-mode . cr ;m ;class