column-major order support for matrix

This commit is contained in:
Matej Sekoranja
2012-10-13 14:11:40 +02:00
parent 0b44c4894c
commit a729998b3f
2 changed files with 24 additions and 9 deletions

View File

@@ -31,6 +31,7 @@ PrintMode mode = ValueOnlyMode;
char fieldSeparator = ' ';
bool columnMajor = false;
void formatNTAny(std::ostream& o, PVStructurePtr const & pvStruct)
{
@@ -365,7 +366,10 @@ void formatNTMatrix(std::ostream& o, PVStructurePtr const & pvStruct)
for (int32 c = 0; c < cols; c++)
{
o << std::setw(maxColumnLength) << std::right;
value->dumpValue(o, ix++);
if (columnMajor)
value->dumpValue(o, r + c * rows);
else
value->dumpValue(o, ix++);
}
o << std::endl;
}
@@ -378,12 +382,16 @@ void formatNTMatrix(std::ostream& o, PVStructurePtr const & pvStruct)
// el2 el5
// el3 el6
//
size_t ix = 0;
for (int32 c = 0; c < cols; c++)
{
for (int32 r = 0; r < rows; r++)
{
o << std::setw(maxColumnLength) << std::right;
value->dumpValue(o, r * rows + c);
if (columnMajor)
value->dumpValue(o, ix++);
else
value->dumpValue(o, r * cols + c);
}
o << std::endl;
}
@@ -554,10 +562,11 @@ void usage (void)
" -a <service arg>: Service argument in form 'name=value'\n"
" -r <pv request>: Get request string, specifies what fields to return and options, default is '%s'\n"
" -w <sec>: Wait time, specifies timeout, default is %f second(s)\n"
" -q: Pure pvAccess RPC based service (send NTURI.query as request argument)\n"
" -q: Pure pvAccess RPC based service (send NTURI.query as request argument)\n"
" -t: Terse mode / transpose vector, table, matrix.\n"
" -x: Use column-major order to decode matrix.\n"
" -d: Enable debug output\n"
" -F <ofs>: Use <ofs> as an alternate output field separator\n"
" -F <ofs>: Use <ofs> as an alternate output field separator\n"
" -c: Wait for clean shutdown and report used instance count (for expert users)"
"\n\nexamples:\n\n"
"#! Get the value of the PV corr:li32:53:bdes\n"
@@ -818,7 +827,7 @@ int main (int argc, char *argv[])
setvbuf(stdout,NULL,_IOLBF,BUFSIZ); /* Set stdout to line buffering */
while ((opt = getopt(argc, argv, ":hr:s:a:w:qtdcF:")) != -1) {
while ((opt = getopt(argc, argv, ":hr:s:a:w:qtxdcF:")) != -1) {
switch (opt) {
case 'h': /* Print usage */
usage();
@@ -863,6 +872,9 @@ int main (int argc, char *argv[])
case 't': /* Terse mode */
mode = TerseMode;
break;
case 'x': /* Column-major order mode */
columnMajor = true;
break;
case 'd': /* Debug log level */
debug = true;
break;

View File

@@ -466,7 +466,6 @@ class MockChannelRPC : public ChannelRPC
#define FILL_VALUES(OFFSET) \
for (int r = 0; r < ROWS; r++) \
values[r] = rand()/((double)RAND_MAX+1) + OFFSET;
// values[r] = (rand()-RAND_MAX/2)/(double)(RAND_MAX/2); // -1 ... 1
int offset = 0;
for (vector<String>::iterator iter = labels.begin();
@@ -487,7 +486,6 @@ class MockChannelRPC : public ChannelRPC
pvArgument
);
// TODO type check, getStringField is verbose
PVStringPtr rows = static_pointer_cast<PVString>(args->getSubField("rows"));
PVStringPtr columns = static_pointer_cast<PVString>(args->getSubField("columns"));
if (rows.get() == 0 || columns.get() == 0)
@@ -520,11 +518,16 @@ class MockChannelRPC : public ChannelRPC
srand ( time(NULL) );
PVStringPtr byColumns = static_pointer_cast<PVString>(args->getSubField("bycolumns"));
bool bycolumns = (byColumns.get() && byColumns->get() == "1");
int32 len = rowsVal * colsVal;
vector<double> mv(len);
for (int r = 0; r < len; r++)
// mv[r] = (rand()-RAND_MAX/2)/(double)(RAND_MAX/2); // -1 .. 1
mv[r] = rand()/((double)RAND_MAX+1) + r/rowsVal;
if (bycolumns)
mv[r] = rand()/((double)RAND_MAX+1) + (int)(r%rowsVal);
else
mv[r] = rand()/((double)RAND_MAX+1) + (int)(r/colsVal);
static_pointer_cast<PVDoubleArray>(result->getScalarArrayField("value", pvDouble))->put(0, len, &mv[0], 0);
m_channelRPCRequester->requestDone(Status::Ok, result);