From a729998b3f0e8e65fb224a591c7dcb150c06e769 Mon Sep 17 00:00:00 2001 From: Matej Sekoranja Date: Sat, 13 Oct 2012 14:11:40 +0200 Subject: [PATCH] column-major order support for matrix --- testApp/remote/eget.cpp | 22 +++++++++++++++++----- testApp/remote/testServer.cpp | 11 +++++++---- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/testApp/remote/eget.cpp b/testApp/remote/eget.cpp index bf776cd..837819d 100644 --- a/testApp/remote/eget.cpp +++ b/testApp/remote/eget.cpp @@ -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 argument in form 'name=value'\n" " -r : Get request string, specifies what fields to return and options, default is '%s'\n" " -w : 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 : Use as an alternate output field separator\n" + " -F : Use 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; diff --git a/testApp/remote/testServer.cpp b/testApp/remote/testServer.cpp index 2e8edfe..a96f8f8 100644 --- a/testApp/remote/testServer.cpp +++ b/testApp/remote/testServer.cpp @@ -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::iterator iter = labels.begin(); @@ -487,7 +486,6 @@ class MockChannelRPC : public ChannelRPC pvArgument ); - // TODO type check, getStringField is verbose PVStringPtr rows = static_pointer_cast(args->getSubField("rows")); PVStringPtr columns = static_pointer_cast(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(args->getSubField("bycolumns")); + bool bycolumns = (byColumns.get() && byColumns->get() == "1"); + int32 len = rowsVal * colsVal; vector 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(result->getScalarArrayField("value", pvDouble))->put(0, len, &mv[0], 0); m_channelRPCRequester->requestDone(Status::Ok, result);