graph happiness
This commit is contained in:
parent
6d96736fad
commit
47e6c8139e
|
@ -26,3 +26,4 @@ struct scores {
|
||||||
void scores_(struct scores *);
|
void scores_(struct scores *);
|
||||||
struct scores scores(struct journal *);
|
struct scores scores(struct journal *);
|
||||||
int scores_is_empty(const struct scores *);
|
int scores_is_empty(const struct scores *);
|
||||||
|
const char *scores_to_string(const struct scores *);
|
||||||
|
|
|
@ -102,8 +102,8 @@ static int scan(union date32 date, const char *const buffer,
|
||||||
case TREE_ERROR: goto catch;
|
case TREE_ERROR: goto catch;
|
||||||
case TREE_ABSENT: *pidx = idx; break;
|
case TREE_ABSENT: *pidx = idx; break;
|
||||||
}
|
}
|
||||||
date32_to_string(date, &datestr);
|
/*date32_to_string(date, &datestr);
|
||||||
printf("%s: <%.*s>\n", datestr, (int)(s1 - s0), s0);
|
fprintf(stderr, "%s: <%.*s>\n", datestr, (int)(s1 - s0), s0);*/
|
||||||
continue;
|
continue;
|
||||||
} }
|
} }
|
||||||
/* New score. */
|
/* New score. */
|
||||||
|
@ -116,7 +116,7 @@ static int scan(union date32 date, const char *const buffer,
|
||||||
}
|
}
|
||||||
if(!(score = scorelist_array_new(&scores->list))) goto catch;
|
if(!(score = scorelist_array_new(&scores->list))) goto catch;
|
||||||
*idx = (size_t)(score - scores->list.data);
|
*idx = (size_t)(score - scores->list.data);
|
||||||
/*struct pair key, name; union date32 date; unsigned edges;*/
|
/*struct pair key, name; union date32 date, last; unsigned edges;*/
|
||||||
score->key.a = s0, score->key.b = s1;
|
score->key.a = s0, score->key.b = s1;
|
||||||
score->name.a = 0, score->name.b = 0;
|
score->name.a = 0, score->name.b = 0;
|
||||||
score->date.u32 = score->last.u32 = 0;
|
score->date.u32 = score->last.u32 = 0;
|
||||||
|
@ -126,10 +126,6 @@ static int scan(union date32 date, const char *const buffer,
|
||||||
datestr, (int)(s1 - s0), s0, *idx);
|
datestr, (int)(s1 - s0), s0, *idx);
|
||||||
goto also_add_to_tree;
|
goto also_add_to_tree;
|
||||||
}
|
}
|
||||||
/*ws* @name0 [^\x00\n;]+ @name1 ";"
|
|
||||||
ws* @year0 natural @year1 "-" @month [0-1][0-9] "-" @day [0-1][0-9] ";"
|
|
||||||
ws*
|
|
||||||
/ "\n" => skip*/
|
|
||||||
<score_name> * { why = "name unrecognized"; goto catch; }
|
<score_name> * { why = "name unrecognized"; goto catch; }
|
||||||
<score_date> * { why = "date unrecognized"; goto catch; }
|
<score_date> * { why = "date unrecognized"; goto catch; }
|
||||||
<score_edges> * { why = "edges unrecognized"; goto catch; }
|
<score_edges> * { why = "edges unrecognized"; goto catch; }
|
||||||
|
@ -193,17 +189,91 @@ finally:
|
||||||
int scores_is_empty(const struct scores *const s)
|
int scores_is_empty(const struct scores *const s)
|
||||||
{ return !s || !s->dates.root.node; }
|
{ return !s || !s->dates.root.node; }
|
||||||
|
|
||||||
|
const char *scores_to_string(const struct scores *const s)
|
||||||
|
{ return assert(s), scorelist_array_to_string(&s->list); }
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
int main(void) {
|
int main(void) {
|
||||||
struct journal j = journal();
|
const char *fail = 0;
|
||||||
if(journal_is_empty(&j)) goto catch;
|
struct journal jrnl = {0};
|
||||||
struct scores s = scores(&j);
|
struct scores scrs = {0};
|
||||||
if(scores_is_empty(&s)) goto catch;
|
errno = 0;
|
||||||
|
|
||||||
|
jrnl = journal();
|
||||||
|
fprintf(stderr, "Journal: %s.\n", journal_to_string(&jrnl));
|
||||||
|
if(journal_is_empty(&jrnl)) { fail = "journal failed to load"; goto catch; }
|
||||||
|
scrs = scores(&jrnl);
|
||||||
|
fprintf(stderr, "Scores: %s.\n", scores_to_string(&scrs));
|
||||||
|
if(scores_is_empty(&scrs)) { fail = "scores failed to parse"; goto catch; }
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
struct score_tree_iterator it = score_tree_iterator(&scrs.dates);
|
||||||
|
union line64 line;
|
||||||
|
struct score *score;
|
||||||
|
|
||||||
|
printf("set terminal pngcairo dashed transparent truecolor"
|
||||||
|
" size 840, 480 fontscale 1\n"
|
||||||
|
"set output \"score.png\"\n");
|
||||||
|
printf("$Data <<EOD\n"
|
||||||
|
"# date, key\n");
|
||||||
|
while(score_tree_next(&it)) {
|
||||||
|
line = score_tree_key(&it);
|
||||||
|
score = scrs.list.data + *score_tree_value(&it);
|
||||||
|
char datestr[12];
|
||||||
|
date32_to_string(line.date, &datestr);
|
||||||
|
printf("%s, %.*s\n", datestr,
|
||||||
|
(int)(score->key.b - score->key.a), score->key.a);
|
||||||
|
}
|
||||||
|
printf("EOD\n"
|
||||||
|
"# theozh https://stackoverflow.com/a/75466214/2472827\n"
|
||||||
|
"# get a unique list from datablock\n"
|
||||||
|
"addToList(list,col) = list.( strstrt(list,'\"'.strcol(col).'\"') \\\n"
|
||||||
|
" > 0 ? '' : ' \"'.strcol(col).'\"')\n"
|
||||||
|
"Uniqs = ''\n"
|
||||||
|
"stats $Data u (Uniqs=addToList(Uniqs,2)) nooutput\n"
|
||||||
|
"Uniq(i) = word(Uniqs,i)\n"
|
||||||
|
"getIndex(s) = sum [_i=1:words(Uniqs)] s eq word(Uniqs,_i) ? _i : 0\n"
|
||||||
|
"\n"
|
||||||
|
/*"stats $Data u 3 nooutput\n"
|
||||||
|
"cumsum = STATS_sum\n"
|
||||||
|
"stats $Data u 4 nooutput\n"
|
||||||
|
"setsum = STATS_sum\n"
|
||||||
|
"\n"*/
|
||||||
|
"myTimeFmt = \"%%Y-%%m-%%d\"\n"
|
||||||
|
"set format x myTimeFmt timedate\n"
|
||||||
|
"set xtics format myTimeFmt rotate by -30\n"
|
||||||
|
"set ylabel \"happiness CDF (days)\"\n"
|
||||||
|
"set grid\n"
|
||||||
|
"set key out reverse Left noautotitle\n"
|
||||||
|
"set style fill solid 0.5\n"
|
||||||
|
"unset border\n"
|
||||||
|
"set autoscale xfix # max? hack: can't get x to extend further\n"
|
||||||
|
"\n"
|
||||||
|
/*"set label sprintf(\"%%u cumulative words (duplicate verses counted)\","
|
||||||
|
" cumsum) center at graph 0.5, first cumsum*100/%zu offset 0,0.5\n"
|
||||||
|
"set label sprintf(\"%%u unique KJV verse words memorized\", setsum) "
|
||||||
|
"center at graph 0.5, first setsum*100/%zu offset 0,0.5\n"
|
||||||
|
"\n"*/
|
||||||
|
"plot \\\n"
|
||||||
|
" total=0 $Data u"
|
||||||
|
" (timecolumn(1,myTimeFmt)):(total=total+1) \\\n"
|
||||||
|
" w steps lc \"black\" dt 1 lw 1, \\\n"
|
||||||
|
" total=0 '' u \\\n"
|
||||||
|
" (timecolumn(1,myTimeFmt)): \\\n"
|
||||||
|
" (total=total+1,total/2.): \\\n"
|
||||||
|
" (43200): \\\n"
|
||||||
|
" (total/2.): \\\n"
|
||||||
|
" (getIndex(strcol(2))) w boxxy lc var lw 1, \\\n"
|
||||||
|
" for [i=1:words(Uniqs)] keyentry w boxxy lc i ti Uniq(i)\n");
|
||||||
|
#endif
|
||||||
goto finally;
|
goto finally;
|
||||||
|
|
||||||
catch:
|
catch:
|
||||||
perror("score");
|
if(!fail) fail = "score";
|
||||||
|
perror(fail);
|
||||||
finally:
|
finally:
|
||||||
scores_(&s);
|
scores_(&scrs);
|
||||||
return EXIT_SUCCESS;
|
journal_(&jrnl);
|
||||||
|
return fail ? EXIT_FAILURE : EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue