Skip to content

Commit 4d764f1

Browse files
committed
better logging
1 parent 95654f4 commit 4d764f1

File tree

9 files changed

+99
-61
lines changed

9 files changed

+99
-61
lines changed

proj/__init__.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import pyinspect
2+
from rich.pretty import install
23

3-
pyinspect.install_traceback(all_locals=False)
4+
install()
5+
pyinspect.install_traceback()
46

57
# Set up logging
6-
from proj.utils.logging import log
8+
# from proj.utils.logging import log
79

810
# import stuff
911
from proj.model.config import Config

proj/environment/manager.py

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,17 @@
44
import logging
55
import json
66

7-
from rich.logging import RichHandler
8-
97
from fcutils.file_io.io import save_yaml
108

11-
129
from proj.utils.misc import timestamp
13-
from proj import paths, log
10+
from proj import paths
1411
from proj.animation.animate import animate_from_images
1512
from proj.plotting.results import plot_results
1613
from proj.utils.dropbox import DropBoxUtils, upload_folder
1714
from proj.utils.slack import send_slack_message
1815

16+
from loguru import logger
17+
1918

2019
class Manager:
2120
def __init__(self, model, winstor=False):
@@ -58,19 +57,23 @@ def __init__(self, model, winstor=False):
5857

5958
def _start_logging(self):
6059
filename = str(self.datafolder / f"{self.exp_name}.log")
61-
fh = logging.FileHandler(filename)
62-
fh.setFormatter(RichHandler())
63-
log.addHandler(fh)
60+
logger.add(filename)
61+
logger.info("Saving data at: {self.datafolder}")
6462

65-
log.info(
66-
f"[bold green] Saving data at: {self.datafolder}",
67-
extra={"markup": True},
68-
)
63+
# fh = logging.FileHandler(filename)
64+
# fh.setFormatter(RichHandler(rich_tracebacks=True))
65+
# log.addHandler(fh)
66+
# log.addHandler(RichHandler(rich_tracebacks=True))
67+
68+
# log.info(
69+
# f"[bold green] Saving data at: {self.datafolder}",
70+
# extra={"markup": True},
71+
# )
6972

7073
def _log_conf(self):
7174
# log config.py
7275
conf = json.dumps(self.model.config_dict(), sort_keys=True, indent=4)
73-
log.info("Config parameters:\n" + conf, extra={"markup": True})
76+
logger.info("Config parameters:\n" + conf, extra={"markup": True})
7477

7578
def _save_results(self):
7679
# save config
@@ -126,7 +129,7 @@ def _save_video(self):
126129
def _upload_to_dropbox(self):
127130
dbx = DropBoxUtils()
128131
dpx_path = self.datafolder.name
129-
log.info(
132+
logger.info(
130133
f"Uploading data to dropbox at: {dpx_path}", extra={"markup": True}
131134
)
132135

@@ -153,13 +156,13 @@ def conclude(self):
153156

154157
# Upload results to dropbox
155158
if self.winstor:
156-
log.info("Uploading to dropbox", extra={"markup": True})
159+
logger.info("Uploading to dropbox", extra={"markup": True})
157160
try:
158161
self._upload_to_dropbox()
159162
except Exception as e:
160163
logging.error(f"Failed to upload to dropbox: {e}")
161164

162-
log.info("Sending slack message", extra={"markup": True})
165+
logger.info("Sending slack message", extra={"markup": True})
163166
send_slack_message(
164167
f"""
165168
\n
@@ -170,10 +173,10 @@ def conclude(self):
170173
"""
171174
)
172175
else:
173-
log.info("Did not upload to dropbox", extra={"markup": True})
176+
logger.info("Did not upload to dropbox", extra={"markup": True})
174177

175178
def failed(self):
176-
log.info("Sending slack FAILED message", extra={"markup": True})
179+
logger.info("Sending slack FAILED message", extra={"markup": True})
177180
if self.winstor:
178181
send_slack_message(
179182
f"""

proj/environment/plotter.py

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ def _plot_control(self, keep_s=1.2):
148148

149149
ax.set(ylabel="Forces", xlabel="step n")
150150
ax.legend()
151+
ax.set(title="Control")
151152

152153
# mark the times a change of traj idx happened
153154
# for v in self.moved_to_next:
@@ -206,18 +207,38 @@ def _plot_current_variables(self):
206207
)
207208

208209
ax.legend()
210+
ax.set(title="Speed")
209211
ax.set(ylabel="speed", xlabel="trajectory progression")
210212

211213
def _plot_accelerations(self):
212214
ax = self.accel_ax
213215
ax.clear()
214216

215217
ax.bar(
216-
[0, 1],
217-
[self.model.curr_dxdt.v_dot, self.model.curr_dxdt.omega_dot],
218-
color=[colors["v"], colors["omega"]],
218+
[0, 1, 2, 3],
219+
[
220+
self.model.curr_dxdt.v_dot,
221+
self.model.curr_dxdt.omega_dot,
222+
self.model.curr_wheel_state.nudot_left,
223+
self.model.curr_wheel_state.nudot_right,
224+
],
225+
color=[
226+
colors["v"],
227+
colors["omega"],
228+
desaturate_color(colors["tau_l"]),
229+
desaturate_color(colors["tau_r"]),
230+
],
231+
)
232+
ax.set(
233+
xticklabels=[
234+
"$\dot{v}$",
235+
"$\dot{\omega}$",
236+
"$\dot{\\nu_R}$",
237+
"$\dot{\\nu_L}$",
238+
],
239+
xticks=[0, 1, 2, 3],
219240
)
220-
ax.set(xticklabels=["$\dot{v}$", "$\dot{\omega}$"], xticks=[0, 1])
241+
ax.set(title="Acceleration")
221242

222243
def _plot_cost(self, keep_s=1.2):
223244
keep_n = int(keep_s / self.model.dt)
@@ -237,6 +258,7 @@ def _plot_cost(self, keep_s=1.2):
237258
x, label=k, lw=3, solid_capstyle="round", color=colors[k],
238259
)
239260
ax.legend()
261+
ax.set(title="Cost")
240262

241263
def _plot_goal(self, goal):
242264
self.goal_ax.clear()
@@ -256,6 +278,7 @@ def _plot_goal(self, goal):
256278

257279
self.goal_ax.legend()
258280
self.goal_ax.set(xticks=[])
281+
self.goal_ax.set(title="Goal")
259282

260283
def visualize_world_live(self, curr_goals, elapsed=None):
261284
ax = self.xy_ax

proj/environment/trajectories.py

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
from fcutils.maths.filtering import line_smoother
1616

1717
from proj.utils.misc import interpolate_nans
18-
from proj import log
18+
19+
# from proj import log
20+
from loguru import logger
1921

2022

2123
def complete_given_xy(x, y, params, planning_params):
@@ -83,7 +85,7 @@ def compute_trajectory_stats(
8385
)
8486

8587
# log stuff
86-
logging.info(
88+
logger.info(
8789
f"""
8890
Trajectory metadata
8991
@@ -100,19 +102,26 @@ def compute_trajectory_stats(
100102
print(table)
101103

102104
if waypoint_density < 2 or waypoint_density > 3:
103-
log.info(
104-
f"[bold red]Waypoint density of {round(waypoint_density, 3)} out of range, it should be 2 < wp < 3!",
105+
logger.info(
106+
f"Waypoint density of {round(waypoint_density, 3)} out of range, it should be 2 < wp < 3!",
105107
extra={"markdown": True},
106108
)
109+
print(
110+
f"[bold red]Waypoint density of {round(waypoint_density, 3)} out of range, it should be 2 < wp < 3!"
111+
)
107112

108113
if perc_lookahead < 0.05:
109-
log.info(
110-
f"[bold red]Lookahead of {lookahead} is {perc_lookahead} of the # of waypoints, that might be too low. Values closer to 5% are advised.",
114+
logger.info(
115+
f"Lookahead of {lookahead} is {perc_lookahead} of the # of waypoints, that might be too low. Values closer to 5% are advised.",
111116
extra={"markdown": True},
112117
)
113-
118+
print(
119+
f"[bold red]Lookahead of {lookahead} is {perc_lookahead} of the # of waypoints, that might be too low. Values closer to 5% are advised."
120+
)
114121
if distance_travelled < min_dist_travelled * params["px_to_cm"]:
115-
log.warning("Distance travelled below minimal requirement, erroring")
122+
logger.warning(
123+
"Distance travelled below minimal requirement, erroring"
124+
)
116125
return None, None
117126

118127
return trajectory, duration

proj/model/config.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ class Config:
5757
mouse_type = "realistic"
5858
model_type = "cart"
5959

60-
dt = 0.005
60+
dt = 0.01
6161

6262
# ------------------------------ Goal trajectory ----------------------------- #
6363

proj/model/model.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -271,26 +271,27 @@ def get_wheels_dynamics(self):
271271
v,
272272
omega,
273273
) = self.variables.values()
274-
275-
x_dot, y_dot, theta_dot = symbols("xdot, ydot, thetadot")
276274
nu_l_dot, nu_r_dot = symbols("nudot_L, nudot_R")
277275

278-
vels = Matrix([x_dot, y_dot, theta_dot])
276+
# define vecs and matrices
277+
vels = Matrix([v, omega])
279278
K = Matrix(
280279
[
281280
[R / 2 * cos(theta), R / 2 * cos(theta)],
282281
[R / 2 * sin(theta), R / 2 * sin(theta)],
283-
[R / (2 * L), R / (2 * L)],
282+
[R / (2 * L), -R / (2 * L)],
284283
]
285284
)
286285

286+
Q = Matrix([[sin(theta), 0], [cos(theta), 0], [0, 1]])
287+
287288
# In the model you can use the wheels accelerations
288289
# to get the x,y,theta velocity.
289290
# Here we do the inverse, given x,y,theta velocities
290291
# we get the wheel's accelerations
291292

292-
nu = K.pinv() * vels
293-
args = [L, R, theta, x_dot, y_dot, theta_dot]
293+
nu = K.pinv() * Q * vels
294+
args = [L, R, theta, v, omega]
294295
self.calc_wheels_accels = lambdify(args, nu, modules="numpy")
295296

296297
def step(self, u):
@@ -315,9 +316,8 @@ def step(self, u):
315316
variables["L"],
316317
variables["R"],
317318
variables["theta"],
318-
self.curr_dxdt.x_dot,
319-
self.curr_dxdt.y_dot,
320-
self.curr_dxdt.theta_dot,
319+
self.curr_x.v,
320+
self.curr_x.omega,
321321
)
322322
self.curr_wheel_state = self._wheel_state(*w.ravel())
323323

proj/run/runner.py

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
import numpy as np
88
from rich import print
99
from rich.text import Text
10-
import logging
11-
import traceback
10+
11+
from loguru import logger
1212

1313

1414
class SpeedColumn(TextColumn):
@@ -55,12 +55,11 @@ def run_experiment(
5555
5656
:returns: the history of events as stored by model
5757
"""
58-
log = logging.getLogger("rich")
5958

6059
# reset things
6160
trajectory = environment.reset()
6261
if trajectory is None:
63-
log.info("Failed to get a valid trajectory")
62+
logger.info("Failed to get a valid trajectory")
6463
environment.failed()
6564
return
6665

@@ -102,27 +101,26 @@ def run_experiment(
102101

103102
# log status once a (simulation) second
104103
if itern % int(1 / model.dt) == 0:
105-
log.info(
104+
logger.info(
106105
f"Iteration {itern}/{n_steps}. Current cost: {environment.curr_cost}."
107106
)
108107

109108
# Check if we're done
110109
if environment.isdone(model.curr_x, trajectory):
111-
log.info("environment says we're DONE")
110+
logger.info("environment says we're DONE")
112111
break
113112
if environment.stop:
114-
log.info("environment says STOP")
113+
logger.info("environment says STOP")
115114
break
116115

117116
except Exception as e:
118-
logging.error(
117+
logger.exception(
119118
f"Failed to take next step in simulation.\nError: {e}\n\n"
120119
)
121-
logging.error(traceback.print_exc())
122120
environment.failed()
123121
return
124122

125-
log.info(f"Terminated after {itern} iterations.")
123+
logger.info(f"Terminated after {itern} iterations.")
126124

127125
# save data and close stuff
128126
environment.conclude()

proj/utils/logging.py

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,26 @@
11
import logging
22
from rich.logging import RichHandler
3-
from rich.console import Console
43

54
# supress warnings
65
import pandas as pd
76
import warnings
87

8+
from loguru import logger
9+
10+
911
warnings.simplefilter(action="ignore", category=pd.errors.PerformanceWarning)
1012

1113
# Set up RICH logger
12-
logging.basicConfig(
13-
level=logging.INFO,
14-
format="%(message)s",
15-
datefmt="[%X]",
16-
handlers=[RichHandler(rich_tracebacks=True)],
14+
logger.configure(
15+
handlers=[
16+
{
17+
"sink": RichHandler(rich_tracebacks=True, markup=True),
18+
"format": "{message}",
19+
}
20+
]
1721
)
18-
19-
log = logging.getLogger("rich")
20-
logging_console = Console(record=True)
22+
logger.debug("This is a debug statement")
23+
logger.info("This is an info statement")
2124

2225

2326
# Disable logging some packages

run_allocentric.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import pyinspect
44

5-
pyinspect.install_traceback(all_locals=False)
5+
pyinspect.install_traceback()
66

77

88
from proj import (

0 commit comments

Comments
 (0)