*
* Copyright 2005 Alessandro Scotti
*
- * Enhancements Copyright 1995, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc.
+ * Enhancements Copyright 1995, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Free Software Foundation, Inc.
*
* ------------------------------------------------------------------------
*
#define MAX_VAR 400
static int scores[MAX_VAR], textEnd[MAX_VAR], keys[MAX_VAR], curDepth[2], nrVariations[2];
+static char fail[MAX_VAR];
extern int initialRulePlies;
header[which][0] = NULLCHAR;
if(gameMode == AnalyzeMode) {
ChessProgramState *cps = (which ? &second : &first);
+ char *exclu = cps->excludeMoves ? exclusionHeader : "";
if((multi = MultiPV(cps)) >= 0) {
snprintf(header[which], MSG_SIZ, "\t%s viewpoint\t\tfewer / Multi-PV setting = %d / more\n",
appData.whitePOV || appData.scoreWhite ? "white" : "mover", cps->option[multi].value);
}
- if(!which) snprintf(header[which]+strlen(header[which]), MSG_SIZ-strlen(header[which]), "%s%s", exclusionHeader, columnHeader);
+ if(!which) snprintf(header[which]+strlen(header[which]), MSG_SIZ-strlen(header[which]), "%s%s", exclu, columnHeader);
InsertIntoMemo( which, header[which], 0);
} else {
snprintf(header[which], MSG_SIZ, "%s", columnHeader);
// [HGM] multivar: sort Thinking Output within one depth on score
static int
+MateFlip (int n)
+{ // map mate-score to monotonous scale, so sorting compares them correctly
+ if(n >= MATE_SCORE) return 2*MATE_SCORE - n;
+ if(n <= -MATE_SCORE) return -2*MATE_SCORE - n;
+ return n;
+}
+
+static int
InsertionPoint (int len, EngineOutputData *ed)
{
int i, offs = 0, newScore = ed->score, n = ed->which;
+ char failType;
if(ed->nodes == 0 && ed->score == 0 && ed->time == 0)
newScore = 1e6; // info lines inserted on top
curDepth[n] = ed->depth;
nrVariations[n] = 0; // throw away everything we had
}
+ i = strlen(ed->pv); if(i > 0) i--;
+ failType = ed->pv[i];
+ if(failType != '?' && failType != '!') failType = ' ';
// loop through all lines. Note even / odd used for different panes
for(i=nrVariations[n]-2; i>=0; i-=2) {
// put new item behind those we haven't looked at
textEnd[i+n+2] = offs + len;
scores[i+n+2] = newScore;
keys[i+n+2] = ed->moveKey;
+ fail[i+n+2] = failType;
if(ed->moveKey != keys[i+n] && // same move always tops previous one (as a higher score must be a fail low)
- newScore < scores[i+n]) break;
+ MateFlip(newScore) < MateFlip(scores[i+n]) && fail[i+n] == ' ') break;
// if it had higher score as previous, move previous in stead
scores[i+n+2] = ed->moveKey == keys[i+n] ? newScore : scores[i+n]; // correct scores of fail-low/high searches
textEnd[i+n+2] = textEnd[i+n] + len;
keys[i+n+2] = keys[i+n];
+ fail[i+n+2] = fail[i+n];
}
if(i<0) {
offs = 0;
textEnd[n] = offs + len;
scores[n] = newScore;
keys[n] = ed->moveKey;
+ fail[n] = failType;
}
nrVariations[n] += 2;
return offs + strlen(header[ed->which]);
}
-#define MATE_SCORE 100000
static char spaces[] = " "; // [HGM] align: spaces for padding
static void
snprintf( buf, 24, "%d%s\t", val, spaces + 2*i);
}
else {
- snprintf( buf, 24, "%.1fM%s\t", val/1000000.0, spaces + 8 + 2*(val > 1e7));
+ char unit = 'M';
+ if(val >= 1e9) val /= 1e3, unit = 'G';
+ snprintf( buf, 24, "%.*f%c%s\t", 1 + (val < 1e7), val/1e6, unit, spaces + 10 + 2*(val >= 1e8));
}
}
snprintf( s_nodes, sizeof(s_nodes)/sizeof(s_nodes[0]), u64Display "%s\t", ed->nodes, spaces + 2*i);
}
else {
- snprintf( s_nodes, sizeof(s_nodes)/sizeof(s_nodes[0]), "%.1fM%s\t", u64ToDouble(ed->nodes) / 1000000.0,
- spaces + 8 + 2*(ed->nodes > 1e7));
+ double x = u64ToDouble(ed->nodes);
+ char unit = 'M';
+ if(x >= 1e9) x /= 1e3, unit = 'G';
+ snprintf( s_nodes, sizeof(s_nodes)/sizeof(s_nodes[0]), "%.*f%c%s\t", 1 + (x < 1e7), x / 1e6,
+ unit, spaces + 10 + 2*(ed->nodes >= 1e8));
}
/* TB Hits etc. */
}
Format(s_seld, params[0]); Format(s_knps, params[1]); Format(s_hits, hits);
- fail = ed->pv[strlen(ed->pv)-1];
+ if(*ed->pv) fail = ed->pv[strlen(ed->pv)-1]; else fail = ' ';
if(fail != '?' && fail != '!') fail = ' ';
/* Score */
}
/* Time */
+ if(time_secs >= 3600)
+ snprintf( s_time, sizeof(s_time)/sizeof(s_time[0]), "%d:%02d:%02d\t", time_secs / 3600, (time_secs / 60) % 60, time_secs % 60 );
+ else
snprintf( s_time, sizeof(s_time)/sizeof(s_time[0]), "%d:%02d.%02d\t", time_secs / 60, time_secs % 60, time_cent );
if(columnMask & 2) s_score[0] = NULLCHAR; // [HGM] hide: erase columns the user has hidden