We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Learning rate printing
Now it will only print 0.00. Maybe we should print it with scientific notation.

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `speechbrain/utils/train_logger.py`
Content:
```
1 import logging
2 from speechbrain.utils.edit_distance import wer_summary
3 
4 logger = logging.getLogger(__name__)
5 
6 
7 class TrainLogger:
8     """Abstract class defining an interface for training loggers."""
9 
10     def log_stats(
11         self,
12         stats_meta,
13         train_stats=None,
14         valid_stats=None,
15         test_stats=None,
16         verbose=False,
17     ):
18         """Log the stats for one epoch.
19 
20         Arguments
21         ---------
22         stats_meta : dict of str:scalar pairs
23             Meta information about the stats (e.g. epoch, learning-rate, etc.)
24         train_stats : dict of str:list pairs
25             Each loss type is represented with a str : list pair including
26             all the values for the training pass.
27         valid_stats : dict of str:list pairs
28             Each loss type is represented with a str : list pair including
29             all the values for the validation pass.
30         test_stats : dict of str:list pairs
31             Each loss type is represented with a str : list pair including
32             all the values for the test pass.
33         verbose : bool
34             Whether to also put logging information to the standard logger.
35         """
36         raise NotImplementedError
37 
38 
39 class FileTrainLogger(TrainLogger):
40     """Text logger of training information
41 
42     Arguments
43     ---------
44     save_file : str
45         The file to use for logging train information.
46     summary_fns : dict of str:function pairs
47         Each summary function should take a list produced as output
48         from a training/validation pass and summarize it to a single scalar.
49     """
50 
51     def __init__(self, save_file, summary_fns):
52         self.save_file = save_file
53         self.summary_fns = summary_fns
54 
55     def _item_to_string(self, key, value, dataset=None):
56         """Convert one item to string, handling floats"""
57         if isinstance(value, float):
58             value = f"{value:.2f}"
59         if dataset is not None:
60             key = f"{dataset} {key}"
61         return f"{key}: {value}"
62 
63     def _stats_to_string(self, stats, dataset=None):
64         """Convert all stats to a single string summary"""
65         return ", ".join(
66             [self._item_to_string(k, v, dataset) for k, v in stats.items()]
67         )
68 
69     def log_stats(
70         self,
71         stats_meta,
72         train_stats=None,
73         valid_stats=None,
74         test_stats=None,
75         verbose=True,
76     ):
77         """See TrainLogger.log_stats()"""
78         string_summary = self._stats_to_string(stats_meta)
79         for dataset, stats in [
80             ("train", train_stats),
81             ("valid", valid_stats),
82             ("test", test_stats),
83         ]:
84             if stats is None:
85                 continue
86             summary = {}
87             for stat, value_list in stats.items():
88                 summary[stat] = self.summary_fns[stat](value_list)
89             string_summary += " - " + self._stats_to_string(summary, dataset)
90 
91         with open(self.save_file, "a") as fout:
92             print(string_summary, file=fout)
93         if verbose:
94             logger.info(string_summary)
95 
96 
97 class TensorboardLogger(TrainLogger):
98     """Logs training information in the format required by Tensorboard.
99 
100     Arguments
101     ---------
102     save_dir : str
103         A directory for storing all the relevant logs
104 
105     Raises
106     ------
107     ImportError if Tensorboard is not installed.
108     """
109 
110     def __init__(self, save_dir):
111         self.save_dir = save_dir
112 
113         # Raises ImportError if TensorBoard is not installed
114         from torch.utils.tensorboard import SummaryWriter
115 
116         self.writer = SummaryWriter(self.save_dir)
117         self.global_step = {"train": {}, "valid": {}, "meta": 0}
118 
119     def log_stats(
120         self,
121         stats_meta,
122         train_stats=None,
123         valid_stats=None,
124         test_stats=None,
125         verbose=False,
126     ):
127         """See TrainLogger.log_stats()"""
128         self.global_step["meta"] += 1
129         for name, value in stats_meta.items():
130             self.writer.add_scalar(name, value, self.global_step["meta"])
131 
132         for dataset, stats in [
133             ("train", train_stats),
134             ("valid", valid_stats),
135             ("test", test_stats),
136         ]:
137             if stats is None:
138                 continue
139             for stat, value_list in stats.items():
140                 if stat not in self.global_step[dataset]:
141                     self.global_step[dataset][stat] = 0
142                 tag = f"{stat}/{dataset}"
143                 for value in value_list:
144                     new_global_step = self.global_step[dataset][stat] + 1
145                     self.writer.add_scalar(tag, value, new_global_step)
146                     self.global_step[dataset][stat] = new_global_step
147 
148 
149 def summarize_average(stat_list):
150     return float(sum(stat_list) / len(stat_list))
151 
152 
153 def summarize_error_rate(stat_list):
154     summary = wer_summary(stat_list)
155     return summary["WER"]
156
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/speechbrain/utils/train_logger.py b/speechbrain/utils/train_logger.py
--- a/speechbrain/utils/train_logger.py
+++ b/speechbrain/utils/train_logger.py
@@ -54,8 +54,10 @@
 
     def _item_to_string(self, key, value, dataset=None):
         """Convert one item to string, handling floats"""
-        if isinstance(value, float):
+        if isinstance(value, float) and 0.01 < value < 100.0:
             value = f"{value:.2f}"
+        elif isinstance(value, float):
+            value = f"{value:.2e}"
         if dataset is not None:
             key = f"{dataset} {key}"
         return f"{key}: {value}"

{"golden_diff": "diff --git a/speechbrain/utils/train_logger.py b/speechbrain/utils/train_logger.py\n--- a/speechbrain/utils/train_logger.py\n+++ b/speechbrain/utils/train_logger.py\n@@ -54,8 +54,10 @@\n \n     def _item_to_string(self, key, value, dataset=None):\n         \"\"\"Convert one item to string, handling floats\"\"\"\n-        if isinstance(value, float):\n+        if isinstance(value, float) and 0.01 < value < 100.0:\n             value = f\"{value:.2f}\"\n+        elif isinstance(value, float):\n+            value = f\"{value:.2e}\"\n         if dataset is not None:\n             key = f\"{dataset} {key}\"\n         return f\"{key}: {value}\"\n", "issue": "Learning rate printing\nNow it will only print 0.00. Maybe we should print it with scientific notation.\n", "before_files": [{"content": "import logging\nfrom speechbrain.utils.edit_distance import wer_summary\n\nlogger = logging.getLogger(__name__)\n\n\nclass TrainLogger:\n    \"\"\"Abstract class defining an interface for training loggers.\"\"\"\n\n    def log_stats(\n        self,\n        stats_meta,\n        train_stats=None,\n        valid_stats=None,\n        test_stats=None,\n        verbose=False,\n    ):\n        \"\"\"Log the stats for one epoch.\n\n        Arguments\n        ---------\n        stats_meta : dict of str:scalar pairs\n            Meta information about the stats (e.g. epoch, learning-rate, etc.)\n        train_stats : dict of str:list pairs\n            Each loss type is represented with a str : list pair including\n            all the values for the training pass.\n        valid_stats : dict of str:list pairs\n            Each loss type is represented with a str : list pair including\n            all the values for the validation pass.\n        test_stats : dict of str:list pairs\n            Each loss type is represented with a str : list pair including\n            all the values for the test pass.\n        verbose : bool\n            Whether to also put logging information to the standard logger.\n        \"\"\"\n        raise NotImplementedError\n\n\nclass FileTrainLogger(TrainLogger):\n    \"\"\"Text logger of training information\n\n    Arguments\n    ---------\n    save_file : str\n        The file to use for logging train information.\n    summary_fns : dict of str:function pairs\n        Each summary function should take a list produced as output\n        from a training/validation pass and summarize it to a single scalar.\n    \"\"\"\n\n    def __init__(self, save_file, summary_fns):\n        self.save_file = save_file\n        self.summary_fns = summary_fns\n\n    def _item_to_string(self, key, value, dataset=None):\n        \"\"\"Convert one item to string, handling floats\"\"\"\n        if isinstance(value, float):\n            value = f\"{value:.2f}\"\n        if dataset is not None:\n            key = f\"{dataset} {key}\"\n        return f\"{key}: {value}\"\n\n    def _stats_to_string(self, stats, dataset=None):\n        \"\"\"Convert all stats to a single string summary\"\"\"\n        return \", \".join(\n            [self._item_to_string(k, v, dataset) for k, v in stats.items()]\n        )\n\n    def log_stats(\n        self,\n        stats_meta,\n        train_stats=None,\n        valid_stats=None,\n        test_stats=None,\n        verbose=True,\n    ):\n        \"\"\"See TrainLogger.log_stats()\"\"\"\n        string_summary = self._stats_to_string(stats_meta)\n        for dataset, stats in [\n            (\"train\", train_stats),\n            (\"valid\", valid_stats),\n            (\"test\", test_stats),\n        ]:\n            if stats is None:\n                continue\n            summary = {}\n            for stat, value_list in stats.items():\n                summary[stat] = self.summary_fns[stat](value_list)\n            string_summary += \" - \" + self._stats_to_string(summary, dataset)\n\n        with open(self.save_file, \"a\") as fout:\n            print(string_summary, file=fout)\n        if verbose:\n            logger.info(string_summary)\n\n\nclass TensorboardLogger(TrainLogger):\n    \"\"\"Logs training information in the format required by Tensorboard.\n\n    Arguments\n    ---------\n    save_dir : str\n        A directory for storing all the relevant logs\n\n    Raises\n    ------\n    ImportError if Tensorboard is not installed.\n    \"\"\"\n\n    def __init__(self, save_dir):\n        self.save_dir = save_dir\n\n        # Raises ImportError if TensorBoard is not installed\n        from torch.utils.tensorboard import SummaryWriter\n\n        self.writer = SummaryWriter(self.save_dir)\n        self.global_step = {\"train\": {}, \"valid\": {}, \"meta\": 0}\n\n    def log_stats(\n        self,\n        stats_meta,\n        train_stats=None,\n        valid_stats=None,\n        test_stats=None,\n        verbose=False,\n    ):\n        \"\"\"See TrainLogger.log_stats()\"\"\"\n        self.global_step[\"meta\"] += 1\n        for name, value in stats_meta.items():\n            self.writer.add_scalar(name, value, self.global_step[\"meta\"])\n\n        for dataset, stats in [\n            (\"train\", train_stats),\n            (\"valid\", valid_stats),\n            (\"test\", test_stats),\n        ]:\n            if stats is None:\n                continue\n            for stat, value_list in stats.items():\n                if stat not in self.global_step[dataset]:\n                    self.global_step[dataset][stat] = 0\n                tag = f\"{stat}/{dataset}\"\n                for value in value_list:\n                    new_global_step = self.global_step[dataset][stat] + 1\n                    self.writer.add_scalar(tag, value, new_global_step)\n                    self.global_step[dataset][stat] = new_global_step\n\n\ndef summarize_average(stat_list):\n    return float(sum(stat_list) / len(stat_list))\n\n\ndef summarize_error_rate(stat_list):\n    summary = wer_summary(stat_list)\n    return summary[\"WER\"]\n", "path": "speechbrain/utils/train_logger.py"}], "after_files": [{"content": "import logging\nfrom speechbrain.utils.edit_distance import wer_summary\n\nlogger = logging.getLogger(__name__)\n\n\nclass TrainLogger:\n    \"\"\"Abstract class defining an interface for training loggers.\"\"\"\n\n    def log_stats(\n        self,\n        stats_meta,\n        train_stats=None,\n        valid_stats=None,\n        test_stats=None,\n        verbose=False,\n    ):\n        \"\"\"Log the stats for one epoch.\n\n        Arguments\n        ---------\n        stats_meta : dict of str:scalar pairs\n            Meta information about the stats (e.g. epoch, learning-rate, etc.)\n        train_stats : dict of str:list pairs\n            Each loss type is represented with a str : list pair including\n            all the values for the training pass.\n        valid_stats : dict of str:list pairs\n            Each loss type is represented with a str : list pair including\n            all the values for the validation pass.\n        test_stats : dict of str:list pairs\n            Each loss type is represented with a str : list pair including\n            all the values for the test pass.\n        verbose : bool\n            Whether to also put logging information to the standard logger.\n        \"\"\"\n        raise NotImplementedError\n\n\nclass FileTrainLogger(TrainLogger):\n    \"\"\"Text logger of training information\n\n    Arguments\n    ---------\n    save_file : str\n        The file to use for logging train information.\n    summary_fns : dict of str:function pairs\n        Each summary function should take a list produced as output\n        from a training/validation pass and summarize it to a single scalar.\n    \"\"\"\n\n    def __init__(self, save_file, summary_fns):\n        self.save_file = save_file\n        self.summary_fns = summary_fns\n\n    def _item_to_string(self, key, value, dataset=None):\n        \"\"\"Convert one item to string, handling floats\"\"\"\n        if isinstance(value, float) and 0.01 < value < 100.0:\n            value = f\"{value:.2f}\"\n        elif isinstance(value, float):\n            value = f\"{value:.2e}\"\n        if dataset is not None:\n            key = f\"{dataset} {key}\"\n        return f\"{key}: {value}\"\n\n    def _stats_to_string(self, stats, dataset=None):\n        \"\"\"Convert all stats to a single string summary\"\"\"\n        return \", \".join(\n            [self._item_to_string(k, v, dataset) for k, v in stats.items()]\n        )\n\n    def log_stats(\n        self,\n        stats_meta,\n        train_stats=None,\n        valid_stats=None,\n        test_stats=None,\n        verbose=True,\n    ):\n        \"\"\"See TrainLogger.log_stats()\"\"\"\n        string_summary = self._stats_to_string(stats_meta)\n        for dataset, stats in [\n            (\"train\", train_stats),\n            (\"valid\", valid_stats),\n            (\"test\", test_stats),\n        ]:\n            if stats is None:\n                continue\n            summary = {}\n            for stat, value_list in stats.items():\n                summary[stat] = self.summary_fns[stat](value_list)\n            string_summary += \" - \" + self._stats_to_string(summary, dataset)\n\n        with open(self.save_file, \"a\") as fout:\n            print(string_summary, file=fout)\n        if verbose:\n            logger.info(string_summary)\n\n\nclass TensorboardLogger(TrainLogger):\n    \"\"\"Logs training information in the format required by Tensorboard.\n\n    Arguments\n    ---------\n    save_dir : str\n        A directory for storing all the relevant logs\n\n    Raises\n    ------\n    ImportError if Tensorboard is not installed.\n    \"\"\"\n\n    def __init__(self, save_dir):\n        self.save_dir = save_dir\n\n        # Raises ImportError if TensorBoard is not installed\n        from torch.utils.tensorboard import SummaryWriter\n\n        self.writer = SummaryWriter(self.save_dir)\n        self.global_step = {\"train\": {}, \"valid\": {}, \"meta\": 0}\n\n    def log_stats(\n        self,\n        stats_meta,\n        train_stats=None,\n        valid_stats=None,\n        test_stats=None,\n        verbose=False,\n    ):\n        \"\"\"See TrainLogger.log_stats()\"\"\"\n        self.global_step[\"meta\"] += 1\n        for name, value in stats_meta.items():\n            self.writer.add_scalar(name, value, self.global_step[\"meta\"])\n\n        for dataset, stats in [\n            (\"train\", train_stats),\n            (\"valid\", valid_stats),\n            (\"test\", test_stats),\n        ]:\n            if stats is None:\n                continue\n            for stat, value_list in stats.items():\n                if stat not in self.global_step[dataset]:\n                    self.global_step[dataset][stat] = 0\n                tag = f\"{stat}/{dataset}\"\n                for value in value_list:\n                    new_global_step = self.global_step[dataset][stat] + 1\n                    self.writer.add_scalar(tag, value, new_global_step)\n                    self.global_step[dataset][stat] = new_global_step\n\n\ndef summarize_average(stat_list):\n    return float(sum(stat_list) / len(stat_list))\n\n\ndef summarize_error_rate(stat_list):\n    summary = wer_summary(stat_list)\n    return summary[\"WER\"]\n", "path": "speechbrain/utils/train_logger.py"}]}