211 def invoke(self, args, fromTty):
212 self.dont_repeat()
213
214 parser = GdbOptionParser("show eigen")
215 parser.add_option("-d", "--dataFmt", default="%.2f",
216 help="Format for values")
217 parser.add_option("-f", "--formatWidth", type="int",
218 default=8, help="Field width for values")
219 parser.add_option("-o", "--origin", type="str", nargs="+",
220 help="Origin of the part of the object to print")
221 if False:
222 parser.add_option(
223 "eigenObject", help="Expression giving Eigen::Matrix/Vector to show")
224 parser.add_option(
225 "nx", help="Width of patch to print", type="int", default=0, nargs="?")
226 parser.add_option(
227 "ny", help="Height of patch to print", type="int", default=0, nargs="?")
228
229 opts = parser.parse_args(args)
230 if opts.help:
231 return
232 else:
233 (opts, args) = parser.parse_args(args)
234 if opts.help:
235 return
236
237 if not args:
238 raise gdb.GdbError("Please specify an object")
239 opts.eigenObject = args.pop(0)
240
241 opts.nx, opts.ny = 0, 0
242 if args:
243 opts.nx = int(args.pop(0))
244 if args:
245 opts.ny = int(args.pop(0))
246
247 if args:
248 raise gdb.GdbError(
249 "Unrecognised trailing arguments: %s" % " ".join(args))
250
251 var = gdb.parse_and_eval(opts.eigenObject)
252
253 if not re.search(r"(Eigen|LinearTransform)::(Matrix|Vector)", str(var.type)):
254 raise gdb.GdbError(
255 "Please specify an eigen matrix or vector, not %s" % var.type)
256
257 if re.search(r"shared_ptr<", str(var.type)):
258 var = var["px"].dereference()
259
260 if var.type.code == gdb.TYPE_CODE_PTR:
261 var = var.dereference()
262
263 isMatrix = re.search(r"Matrix", str(var.type))
264 if isMatrix:
265 NX, NY = getEigenMatrixDimensions(var)
266
267 if opts.origin:
268 if len(opts.origin) != 2:
269 raise gdb.GdbError("Please specify both x0 and y0")
270
271 x0 = gdb.parse_and_eval(opts.origin[0])
272 y0 = gdb.parse_and_eval(opts.origin[1])
273 else:
274 x0, y0 = 0, 0
275
276 nx = opts.nx
277 ny = opts.ny
278 if nx == 0:
279 nx = NX
280 if ny == 0:
281 ny = NY
282
283 if nx == 1 and ny == 1:
284 print("%g" % self._vget(var, x0))
285 return
286 else:
287 NX = 0, var["m_storage"]["n"]
288
289 if opts.origin:
290 if len(opts.origin) != 1:
291 raise gdb.GdbError("Please only specify x0")
292
293 x0 = gdb.parse_and_eval(opts.origin[0])
294 else:
295 x0 = 0
296
297 nx = opts.nx
298 if nx == 0:
299 nx = NX
300
301 if nx == 1:
302 print("%g" % self._vget(var, x0))
303 return
304
305
306
307 if isMatrix:
308 print("%-4s" % "", end=' ')
309 for x
in range(x0,
min(NX, x0 + nx)):
310 print("%*d" % (opts.formatWidth, x), end=' ')
311 print("")
312
313 for y
in range(y0,
min(NY, y0 + ny)):
314 print("%-4d" % y, end=' ')
315 for x
in range(x0,
min(NX, x0 + nx)):
316 print("%*s" % (opts.formatWidth, (opts.dataFmt %
317 self._mget(var, x, y))), end=' ')
318 print("")
319 else:
320 for x
in range(x0,
min(NX, x0 + nx)):
321 print("%*s" % (opts.formatWidth, (opts.dataFmt %
322 self._vget(var, x))), end=' ')
323 print("")
324
325 PrintEigenCommand()