On Sun, Nov 05, 2023 at 10:28:38AM +0800, Qian Yun wrote:
> I introduce a new variable "roundingError", its valued was mistakenly
> added to the 'other' class, later it was added to "total" again,
> causing duplication. So I change it to only add to
> the 'other' named stat.
>
> The comparison "if n >= 0.01" is wrong, since we take 2 digits
> accuracy, so it should compare against 0.005, see "significantStat".
> Also "roundStat" is totally useless because it rounds to the third
> digit. We can rely on "FORMAT" to do the rounding.
I suspect that intent of "if n >= 0.01" is different than you think.
Namely, small statistics are likely to have significant error
so it makes sense to supress printing of info for small classes.
I other words, it make sense to have treshold which is bigger
than treshold for rounding to 0.
AFAICS original code is first computing long statistics and if non-long
statistics are desired it throws out computed result and starts again.
It would make sense to have common code which just computes desired
statistics.
Also, before your recent changes long format skipped "other" class
when corresponding time would print as 0 (or maybe was small). Now
it is:
Time: 0.02(evaluation) + 0.00(other) = 0.03 sec
One more thing: did you try to get more accurate timing? In different
context I have found useful microsecond timings: al least on Linux it
is possible to measure real time taken be a routine with microsecond
accuracy. I am not sure how much accuracy one can get from Lisp
routines, but IIRC Clozure CL reports time with microsecond resolution.
>
> I also modified "makeStatString" to simplify the code a bit.
>
> - Qian
>
> diff --git a/src/interp/g-timer.boot b/src/interp/g-timer.boot
> index 2b6e2473..689d614c 100644
> --- a/src/interp/g-timer.boot
> +++ b/src/interp/g-timer.boot
> @@ -41,56 +41,46 @@ makeLongStatStringByProperty _
> total := 0
> str := '""
> otherStatTotal := GET('other, property)
> + roundingError := 0
> for [name,class,:ab] in listofnames repeat
> - name = 'other => 'iterate
> cl := first LASSOC(class, listofclasses)
> n := GET(name, property)
> PUT(cl, classproperty, n + GET(cl, classproperty))
> total := total + n
> - if n >= 0.01
> - then timestr := normalizeStatAndStringify n
> - else
> - timestr := '""
> - otherStatTotal := otherStatTotal + n
> - str := makeStatString(str, timestr, name, flag)
> - PUT('other, property, otherStatTotal)
> - if otherStatTotal > 0 then
> - timestr := normalizeStatAndStringify otherStatTotal
> - str := makeStatString(str, timestr, 'other, flag)
> - total := total + otherStatTotal
> - cl := first LASSOC('other, listofnames)
> - cl := first LASSOC(cl, listofclasses)
> - PUT(cl, classproperty, otherStatTotal + GET(cl, classproperty))
> + name = 'other => 'iterate
> + if significantStat n then
> + str := makeStatString(str, n, name, flag)
> + else
> + roundingError := roundingError + n
> + str := makeStatString(str, otherStatTotal + roundingError, 'other, flag)
> if flag ~= 'long then
> total := 0
> str := '""
> for [class,name,:ab] in listofclasses repeat
> n := GET(name, classproperty)
> - n = 0.0 or n = 0 => 'iterate
> total := total + n
> - timestr := normalizeStatAndStringify n
> - str := makeStatString(str,timestr,ab,flag)
> + str := makeStatString(str, n, ab, flag)
> total := STRCONC(normalizeStatAndStringify total,'" ", units)
> str = '"" => total
> STRCONC(str, '" = ", total)
>
> normalizeStatAndStringify t ==
> FLOATP t =>
> - t := roundStat t
> - t = 0.0 => '"0"
> - FORMAT(nil,'"~,2F",t)
> + significantStat t => FORMAT(nil, '"~,2F", t)
> + '"0"
> INTEGERP t => FORMAT(nil, '"~:d", t)
> STRINGIMAGE t
>
> -roundStat t ==
> - not FLOATP t => t
> - (TRUNCATE (0.5 + t * 1000.0)) / 1000.0
> +-- check if argument is significant enough to be printed.
> +-- current printing accuracy is 2 digits after decimal point.
> +significantStat t == t >= 0.005
>
> makeStatString(oldstr,time,abb,flag) ==
> - time = '"" => oldstr
> + not significantStat time => oldstr
> opening := (flag = 'long => '"("; '" (")
> - oldstr = '"" => STRCONC(time,opening,abb,'")")
> - STRCONC(oldstr,'" + ",time,opening,abb,'")")
> + timestr := normalizeStatAndStringify time
> + oldstr = '"" => STRCONC(timestr, opening, abb, '")")
> + STRCONC(oldstr, '" + ", timestr, opening, abb, '")")
>
> peekTimedName() == IFCAR $timedNameStack
>
> --
> You received this message because you are subscribed to the Google Groups
> "FriCAS - computer algebra system" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/fricas-devel/15923354-2e48-443a-8efc-2ec836994726%40gmail.com.
> diff --git a/src/interp/g-timer.boot b/src/interp/g-timer.boot
> index 2b6e2473..689d614c 100644
> --- a/src/interp/g-timer.boot
> +++ b/src/interp/g-timer.boot
> @@ -41,56 +41,46 @@ makeLongStatStringByProperty _
> total := 0
> str := '""
> otherStatTotal := GET('other, property)
> + roundingError := 0
> for [name,class,:ab] in listofnames repeat
> - name = 'other => 'iterate
> cl := first LASSOC(class, listofclasses)
> n := GET(name, property)
> PUT(cl, classproperty, n + GET(cl, classproperty))
> total := total + n
> - if n >= 0.01
> - then timestr := normalizeStatAndStringify n
> - else
> - timestr := '""
> - otherStatTotal := otherStatTotal + n
> - str := makeStatString(str, timestr, name, flag)
> - PUT('other, property, otherStatTotal)
> - if otherStatTotal > 0 then
> - timestr := normalizeStatAndStringify otherStatTotal
> - str := makeStatString(str, timestr, 'other, flag)
> - total := total + otherStatTotal
> - cl := first LASSOC('other, listofnames)
> - cl := first LASSOC(cl, listofclasses)
> - PUT(cl, classproperty, otherStatTotal + GET(cl, classproperty))
> + name = 'other => 'iterate
> + if significantStat n then
> + str := makeStatString(str, n, name, flag)
> + else
> + roundingError := roundingError + n
> + str := makeStatString(str, otherStatTotal + roundingError, 'other, flag)
> if flag ~= 'long then
> total := 0
> str := '""
> for [class,name,:ab] in listofclasses repeat
> n := GET(name, classproperty)
> - n = 0.0 or n = 0 => 'iterate
> total := total + n
> - timestr := normalizeStatAndStringify n
> - str := makeStatString(str,timestr,ab,flag)
> + str := makeStatString(str, n, ab, flag)
> total := STRCONC(normalizeStatAndStringify total,'" ", units)
> str = '"" => total
> STRCONC(str, '" = ", total)
>
> normalizeStatAndStringify t ==
> FLOATP t =>
> - t := roundStat t
> - t = 0.0 => '"0"
> - FORMAT(nil,'"~,2F",t)
> + significantStat t => FORMAT(nil, '"~,2F", t)
> + '"0"
> INTEGERP t => FORMAT(nil, '"~:d", t)
> STRINGIMAGE t
>
> -roundStat t ==
> - not FLOATP t => t
> - (TRUNCATE (0.5 + t * 1000.0)) / 1000.0
> +-- check if argument is significant enough to be printed.
> +-- current printing accuracy is 2 digits after decimal point.
> +significantStat t == t >= 0.005
>
> makeStatString(oldstr,time,abb,flag) ==
> - time = '"" => oldstr
> + not significantStat time => oldstr
> opening := (flag = 'long => '"("; '" (")
> - oldstr = '"" => STRCONC(time,opening,abb,'")")
> - STRCONC(oldstr,'" + ",time,opening,abb,'")")
> + timestr := normalizeStatAndStringify time
> + oldstr = '"" => STRCONC(timestr, opening, abb, '")")
> + STRCONC(oldstr, '" + ", timestr, opening, abb, '")")
>
> peekTimedName() == IFCAR $timedNameStack
>
--
Waldek Hebisch
--
You received this message because you are subscribed to the Google Groups
"FriCAS - computer algebra system" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/fricas-devel/ZVKmUoHxQ/gqIHPz%40fricas.org.