Year 2020 Resolution Log

  1. Preamble
    1. Master’s Degree
    2. At Least One App
    3. Commitment to Health and Wellness
  2. Rubric
    1. Health and Wellness Penalty Calculation
  3. Resolution Log
    1. January
      1. Week 1: Wed, Jan 1 - Sun, Jan 5
      2. Week 2: Mon, Jan 6 - Sun, Jan 12
      3. Week 3: Mon, Jan 13 - Sun, Jan 19
      4. Week 4: Mon, Jan 20 - Sun, Jan 26
      5. Week 5: Mon, Jan 27 - Sun, Feb 2
    2. February
      1. Week 6: Mon, Feb 3 - Sun, Feb 9
      2. Week 7: Mon, Feb 10 - Sun, Feb 16
      3. Week 8: Mon, Feb 17 - Sun, Feb 23
      4. Week 9: Mon, Feb 24 - Sun, Mar 1
    3. March
      1. Week 10: Mon, Mar 2 - Sun, Mar 8
      2. Week 11: Mon, Mar 9 - Sun, Mar 15
      3. Week 12: Mon, Mar 16 - Sun, Mar 22
      4. Week 13: Mon, Mar 23 - Sun, Mar 29
      5. Week 14: Mon, Mar 30 - Sun, Apr 5
    4. April
      1. Week 15: Mon, Apr 6 - Sun, Apr 12
      2. Week 16: Mon, Apr 13 - Sun, Apr 19
      3. Week 17: Mon, Apr 20 - Sun, Apr 26
      4. Week 18: Mon, Apr 27 - Sun, May 3
    5. May
      1. Week 19: Mon, May 4 - Sun, May 10
      2. Week 20: Mon, May 11 - Sun, May 17
      3. Week 21: Mon, May 18 - Sun, May 24
      4. Week 22: Mon May 25 - Sun, May 31
    6. June
      1. Week 23: Mon, Jun 1 - Sun, Jun 7
      2. Week 24: Mon, Jun 8 - Sun, Jun 14
      3. Week 25: Mon, Jun 15 - Sun, Jun 21
      4. Week 26: Mon, Jun 22 - Sun, Jun 28
    7. July
      1. Week 27: Mon, Jun 29 - Sun, Jul 5
      2. Week 28: Mon, Jul 6 - Sun, Jul 12
      3. Week 29: Mon, Jul 13 - Sun, Jul 19
      4. Week 30: Mon, Jul 20 - Sun, Jul 26
    8. August
      1. Week 31: Mon, Jul 27 - Sun, Aug 2
      2. Week 32: Mon, Aug 3 - Sun Aug 9
      3. Week 33: Mon, Aug 10 - Sun, Aug 16
      4. Week 34: Mon, Aug 17 - Sun, Aug 23
      5. Week 35: Mon, Aug 24 - Sun, Aug 30
    9. September
      1. Week 36: Mon, Aug 31 - Sun, Sep 6
      2. Week 37: Mon, Sep 7 - Sun, Sep 13
      3. Week 38: Mon, Sep 14 - Sun, Sep 20
      4. Week 39: Mon, Sep 21 - Sun, Sep 27
    10. October
      1. Week 40: Mon, Sep 28 - Sun, Oct 4
      2. Week 41: Mon, Oct 5 - Sun, Oct 11
      3. Week 42: Mon, Oct 12 - Sun, Oct 18
      4. Week 43: Mon, Oct 19 - Sun, Oct 25
    11. November
      1. Week 44: Mon, Oct 26 - Sun, Nov 1
      2. Week 45: Mon, Nov 2 - Sun, Nov 8
      3. Week 46: Mon, Nov 9 - Sun, Nov 15
      4. Week 47: Mon, Nov 16 - Sun, Nov 22
      5. Week 48: Mon, Nov 23 - Sun, Nov 29
    12. December
      1. Week 49: Mon, Nov 30 - Sun, Dec 6
      2. Week 50: Mon, Dec 7 - Sun, Dec 13
      3. Week 51, Mon Dec 14 - Sun, Dec 20
      4. Week 52, Mon Dec 21 - Sun Dec 27


A New Year’s resolution is a common western tradition where, at the start of the new calendar year, a commitment to lasting change is established.
These resolutions typically include changing an undesired behaviour (quitting smoking), accomplishing a personal goal (going to the gym consistently), or otherwise improving their life (become less offended by others).

By documenting my resolutions, I intend to have an accountable record to refer to when I review the events of the year 2020.
The resolutions that are proposed minimize dependence on external factors, and therefore remain primarily within my realm of control.

Master’s Degree

By the end of 2020, I aim to have a significant portion of my master’s degree thesis completed.
I will adhere to the thesis preparation, requirements, and deadlines set by the University of Alberta Faculty of Graduate Studies and Research.

If possible, my final oral examination (thesis defense) will have been scheduled/completed.

At Least One App

By the end of the year, at least one high quality mobile application will be available to download from the popular mobile application distribution platforms (Google Play Store, Apple App Store).

Commitment to Health and Wellness

Throughout the year, I aim to commit to the following lifestyle changes:

  1. Continue on the Fast-5 daily intermittent fasting schedule.
    Currently, I have successfully fasted since December 22nd, 2019 with an eating window between 2pm and 7pm.

  2. Maintain morning fitness routine with Bonnie.
    I aim to complete at least one ten minute FitnessBlender exercise per day, at least five days a week.
    Two days of arbitrary flex time per week are provided.

  3. Sustain current bouldering (rock climbing) activity at the University.
    The Wilson Climbing Centre is free for students and walking distance from my lab.
    While completing my MSc. thesis, I will attend the climbing wall two times per week, if available.


Resolution Unsatisfactory Satisfactory Good Excellent
Master’s Degree Thesis largely incomplete. Significant effort required (>3 months) for written dissertation. Thesis requires major revision. Between 1-3 months of effort is necessary for dissertation pass and oral examination. Thesis requires minor revision. Less than one month of effort is necessary for degree completion. Thesis complete. Defense scheduled or completed. Convocation scheduled.
Mobile App No mobile application is published on any distribution platform. One application is published onto the major distribution platforms. No other criteria satisfied. One or more applications have been published. Applications have generally positive user feedback, and reviews. More than one application has been published. Applications have positive user feedback, reviews, and monetary income.
Health & Wellness Over 90 inexcusable skips or absences to the Fast-5, FitnessBlender, and Climbing Centre activities. Between 60 and 90 inexcusable combined skips or absences. Between 30 and 60 inexcusable combined skips or absences . Less than 30 inexcusable skips or absences.

Health and Wellness Penalty Calculation

Scores are calculated every Sunday. Skipping one full week of fasting, fitness blender, and climbing would incur a penalty of:

Although inexcusable absences itself is subjective, the intention is to distinguish days where I did not perform a health and wellness activity due to laziness.

Resolution Log

I will update this post every week until the end of 2020.


January 2020 penalty summary:

It is eye opening how long recovery from a cold takes.

Week 1: Wed, Jan 1 - Sun, Jan 5

Fast-5 accomplished each day, climbed on Thursday, Jan 2nd.
Skipped one day of Fitness Blender on Sunday Jan 5.
Most difficult part of this journey is the fast, especially when in social situations where other people are eating.

Week 2: Mon, Jan 6 - Sun, Jan 12

Skipped two days of Fitness Blender.
Fast-5 failed on Sunday due to dinner with girlfriend’s family
I ate outside of the eating window, roughly ~830pm dinner finished.
Climbed on Monday and on Friday.
Weighed self, roughly 69kg (152lb).

Week 3: Mon, Jan 13 - Sun, Jan 19

I’ve been run down with a terrible cold this week.
What had begun on Friday, January 17th as an unusually pervasive sore throat had turned into a weekend of progressively becoming weaker.
A full blown hallucinogenic nightmare of chills, cold sweats, and phlegm occurred by Monday.
That being said, given the time period specified in the header, I was able to climb twice, I never broke the fast, and I skipped two days of Fitness Blender (within my 5 days per week criteria).

Week 4: Mon, Jan 20 - Sun, Jan 26

Most of this week was spent in cold/sickness recovery.
Tuesday, I had a meeting at the CN tower to discuss the ECG research.
Friday, the only day I went to the lab, I was able to reverse engineer the ECG traces from a SQL database dump.
I broke my fasting window Friday the 24th due to Chinese New Year evening dinners at my grandmother’s.
Also no wall climbing was done this week due to illness.

Week 5: Mon, Jan 27 - Sun, Feb 2

I did not adhere to my fast on Saturday February 1st.
I also did not climb at all this week with no valid excuse other than laziness and poor time management.
I performed fitness blender activities at least five times this week.


Week 6: Mon, Feb 3 - Sun, Feb 9

I had a moment of weakness this Saturday morning and indulged in two hotdogs during a grocery run to Costco.
Additionally, this Sunday was my Grandmother’s birthday dinner. I continued eating until well after the 7pm window close.
I missed three days of Fitness blender.
I climbed twice this week.

Week 7: Mon, Feb 10 - Sun, Feb 16

Many lapses in the fasting window occurred this week. Friday, Valentines Day Dinner; Saturday, Post V-Day Dinner Hot Pot with friends, Sunday, Dinner with Bonnie’s family.
I was able to climb twice this week and I performed Fitness Blender every day.

Speaking to a friend about my fasting window and the strictness which I apply my rubric, I was offered a suggestion to begin recording deviation of time from the window, rather than just marking failure cases.
One behavior I see is if I break the window, I no longer have incentive to continue the fast for the remainder of the day.
By having more fine grained logging of my eating habits, it may provide more insight into the effectiveness of the fast.

Week 8: Mon, Feb 17 - Sun, Feb 23

The climbing wall is closed from Feb 15 to Feb 26 due to Adaptability wall construction.
I did not track my eating windows this week, but noted three days in which I had not followed my fasting window schedule of 2-7pm.
I fitness blended daily, with the exception of Thursday.

Week 9: Mon, Feb 24 - Sun, Mar 1

Climbed twice this week. Performed daily fitness blender exercises.
Maintained consistent fasting window, eating only between 2-7pm.

Starting to allow myself to be less strict about fasting as results are very apparent (target weight achieved, have abs again).
Social eating (late dinners in particular) are very problematic for the fasting window.
Most of times my breakfast meal is delayed until 3pm to compensate.
May stop tracking fasting schedule and just delay meals as habit?
Problematic for year-long rubric/schedule.


Week 10: Mon, Mar 2 - Sun, Mar 8

Ate past 7pm on Sunday, March 8th. Otherwise nominal.

Week 11: Mon, Mar 9 - Sun, Mar 15

Deferred to Week 12

Week 12: Mon, Mar 16 - Sun, Mar 22

Last two weeks have been quite a blur. The COVID-19 pandemic seemed to arrive quite suddenly.
On Week 11, I had climbed on the Monday, but was too worried to go climb since.

I had a difficult Friday, Mar 20th. My trusted Dell XPS 13 laptop popped a capacitor and I no longer had a ready to go research laptop. The next day, after taking the day to self reflect and reprioritize I recalled the importance of being mindful, of having stillness and being focused.

At the beginning of the year, I wrote down a rubric outlining grading criteria with respect to my Master’s Degree, the Climbing/Fasting/Health and wellness, and the Mobile app.
I began to feel very discouraged and very nit-picky about tracking my dietary fasting windows and climbing.
However, I remain satisfied with the long term habits that I have developed with respective to my eating and with exercise.
Every morning, with tolerance of 1 day per week, I do fitness blender morning exercises with my girlfriend.
I also remain mindful most days that I do not eat until well into the afternoon. Admittedly, it is not always between 2-7pm, I have limited my evening snacking and pushed my breakfast meal out considerably past my previous limits. I believe that this is the right step for longevity, and the original rigour for keeping to the strict 2-7pm window is no longer appropriate.

I would like to try lists again. I have begun using a task/list application to track necessary todo items. I will try to check off as many of them as I can. Every week, rather than a passive recap of eating windows, I would like to self-reflect on how the lists approach is working.
One thing that was surprising to me was how quickly I was able to get my Linux setup up and running again, and how approachable it was when using the list as a guideline. I will work on how best to phrase the todo items mindfully.

As for the rubric, I am no longer very serious about it, but I intend to reflect back and estimate on good faith how I fared. The metrics for MSc. Thesis and the mobile app are still very applicable, as a deliverable is generated (whereas fitness & health is more a routine)

Week 13: Mon, Mar 23 - Sun, Mar 29

I’ve found that keeping a todo list that I can check off has been very useful in keeping me accountable for my work.
Keeping each task roughly equal to 1 hour’s worth of work appears to be the secret. If the task takes more than an hour to complete, it should be broken down further.
Occasionally, I allow myself to write down tasks that I accomplished but have not recorded ahead of time just to have the satisfaction of marking it off of the list.

As a result of the todo task list, I’ve made progress in the ECG classification problem posed by the Physionet 2020 challenge organizers.
I will submit my new model this week, as well as update the research log in the wiki.

In terms of eating, I am satisfied with my current schedule, which has naturally shifted from a ‘Fast-5’ to a ‘Lean-8’, where my allowed eating time starts around 11am and ends around 7pm. I have not been keeping track of it diligently.

Week 14: Mon, Mar 30 - Sun, Apr 5

This week has been less productive than I would have liked.
I experimented with not taking my morning daily ADHD medication just to see the impact on my day to day activities.
I found that I was less able prioritize and focus on my tasks.
It was difficult for me to plan detailed, itemized tasks for the next days.
I felt like I had greater difficulty in getting out of bed, that I was sleeping in considerably more, and it was more difficult for me to get into the flow of productive work.

That being said, I was still able to make progress in the ECG research. I submitted one successful attempt at the PhysioNet challenge using the newer feature extraction methods.
Will update again next week.


Week 15: Mon, Apr 6 - Sun, Apr 12

Perhaps the most important thing to getting things done is not a framework, like lists, spreadsheets, tracking software, but rather the people that you surround yourself with that push and motivate you to become a better individual.
I’ve seem to hit a little bit of a plateau, using the todo lists to dictate my daily tasks.
It has become difficult to adequately plan the next day’s activities, other than setting a general “Do 1 hour of research”, and then actually accomplishing 4 hours.
One of the challenges with specific, deliverable based tasks is it is hard to know what needs doing before the discovery of what the problem is. Most of research is simply churn, hyperparameter tuning, and waiting.

On an aside, I’ve shaven my head bald. I figured that since COVID-19 related restrictions are not going to ease up within the next week, I would take hair matters into my own hands and clip all of it off.
It was beginning to get difficult to manage.
I am amazed at how people with long hair don’t drive themselves crazy with the itching and shedding.

My daily fitness blender habits and lean-8 meal times are still going strong. The lean-8 is easier to enforce than the fitness blender, but for that I am grateful to have a motivating partner who starts the exercise each morning.

Week 16: Mon, Apr 13 - Sun, Apr 19

This list/todo approach to task completion has been underutilized this week.
Instead, three solid days were dedicated towards ECG classification research with promising results and figures.
Lots of additional experimentation was done given new label-wise plots of F1-scores.

One blocker: my MacBookPro battery has begun to swell.
Before, where my four laptop feet once rested against the table, now the bottom of the laptop bulges out.
I’ve ordered a new battery, but Amazon’s reduced capacity means that it would arrive in early May (est. May 12th).
So much of my productivity depends on reliable access to technology.
Having these laptop issues is a major source of recent anxiety.

Week 17: Mon, Apr 20 - Sun, Apr 26

I really enjoy having the todo-list as a fallback, even if I don’t use it with careful intention.
When there are long running tasks (that recur weekly, for instance) it imposes a much needed sense of routine and order that I find missing in my life, especially since the ‘norm’ of post self-isolation has not fully settled in yet.
I am thankful that I have kombucha that I need to make every two weeks.
I am grateful that I have structured finances and some assets that I need to manage each Monday.
I appreciate that the PhysioNet 2020 CinC abstract deadline is Friday, May 1st.

As an aside, this week I’ve rediscovered Factorio- which has consumed far too much of my life.
I need to show a little bit more restraint when playing that game, perhaps setting more strict timers (limiting myself to 2 hours per day at most, pending the task list).
Additionally, I found myself stuck in this mental loop.

To choose to do nothing is also a choice, which means you cannot truly do nothing

I will complete the abstract, send it off for revision, and work on the opt web application this week.

Week 18: Mon, Apr 27 - Sun, May 3

Despite making progress in the ECG classification research problem, I’ve come to realize a few disappointing facets of my research journey.
I am hitting this wall now of seeing marginal improvements with my classification model, despite adding in various new manual feature extraction techniques.
I am using traditional signal feature extraction approaches and appear to be hitting a bottleneck of sorts- my supervisor and my PhD colleague have different opinions on the usefulness of hyperparameter search.
My supervisor believes it to be a promising next step, while the PhD colleague insists that we are missing some silver bullet of feature extraction/signal representation that will improve performance.
Myself- I see value in both, and it is a toss-up, I do think that setting up some AutoML/hyperparameter tuning experiment using random/genetic search would yield more long-term potential.

This Sunday (May 4th), I’ve hit a bit of a mental and emotional pain point.
I watched the DeepMind documentary on AlphaGo, the reinforcement learning program that defeated the top Go player in the world 4 games to 1.
I was once again reminded that the start of my research journey was not fueled by maximizing an score on some classification challenge, but to explore the fundamental inner workings of deep neural networks and how a self-learning agent can be used to improve itself over time.
Although I think it is too late for me to switch my research gears again, I feel as if I need to make some more space for this learning- that it is inexcusable for me not to pursue this given the time and space gifted to me from the COVID-19 pandemic.

I have made small improvements to opt, namely adding in some stubs for live view user authentication and Create/Read/Update/Delete.
One blocker is that Gigalixir’s free plan, which I graciously use to deploy a prototype version of my application, does not support postgresql citext extension for case insensitive text datatypes.

This week, I aim to have an AutoML experiment running for ECG hyperparameter selection per classification label.
I also aim to add in the Topological Data Analysis Arrhythmia Detection features, even though I am not using deep neural networks in my approach.
I strongly want to resume my Reinforcement Learning (RL) journey by continuing where I left off in the Coursera lectures.


Week 19: Mon, May 4 - Sun, May 10

I’ve setup all the necessary feature extraction and parameter passing meta to enable a full AutoML experiment using microsoft/nni.
Unfortunately, despite searching for three full days (3 days of non-stop experiment running), the hyperparameter search seems to give only a minor improvement to what I already had prior to the search.
The only thing that’s concrete is that XGBoost’s dart booster seems to give better results than gbtree.
Other tree parameters, like max_depth, learning_rate, and gamma, still vary a lot with no statistically significant findings.
The amount of effort required to port over prior work’s feature extraction instructions was non-negligible and consumed the majority of my productive time this week.

I watched a few lecture videos of RL but did not finish a week’s worth of material like I had originally anticipated.
I also did not work on my Phoenix framework web application.
The tasks list has been kept to a minor flow of maintenance tasks.

Because the official phase of the Physionet classification challenge begins this week, I will be continue working on improvements for ECG feature extraction and classification.

Week 20: Mon, May 11 - Sun, May 17

I have moved away from XGBoost classification of ECG records back to deep learning approaches using PyTorch and PyTorch Lightning.
Otherwise this week has been fairly uneventful in terms of research.
I’ve setup a workflow for streaming my desktop environment to various streaming services through Open Broadcaster Software (OBS), in addition to recompiling nginx on my home server to support RTMP video.

This week, I will review the updated dataset released by the Physionet Challenge organizers, as the last week’s submission had an error in the data files.
Additionally, I will continue with the classification/transformers architecture implementation.

Week 21: Mon, May 18 - Sun, May 24

I have setup a working multi-label classification PyTorch lightning experiment such that the thresholds are searched for optimizing over the F-measure.
The loss is Binary Cross Entropy with Logits.
Forward pass during evaluation calculates probabilities using the Sigmoid function.
Treating the multi-label classification problem as a set of binary classifiers was very unstable, either resulting in all negative classes, or frozen to outputting a single value despite changing inputs.
This is not resolved by weighting the loss function according to the imbalanced dataset.

I am still investigating the use of the transformer model architecture for deep learning.
Potential new research direction? Lead classification of signal into 12-lead ecg categories? Forcasting other lead signals given a subset of the 12 leads in ECG?

I played way too much Factorio this week.

Week 22: Mon May 25 - Sun, May 31

I updated my ECG classification experiments to support an arbitrary number of labels, due to the new task of mapping to ~76 SNOMEDCT codes.
A lot of churn, due to the changing challenge requirements, meant that some assumptions I made about the machine learning experimental setup are no longer valid.
I am rerunning the experiments with a larger number of parameters- the intuition is perhaps the transformers and recurrent neural networks are not learning the distribution of the data due to not enough parameters (the SimpleCNN model has over 650k parameters, now the LSTM>Transformer has roughly 250k).

Additional rework of the caching logic needed to occur due to out of memory issues.
I spent too much time trying to initialize a Kubernetes cluster.
Most of my issues were due to the CRI-O runtime not playing nicely with default settings.


Week 23: Mon, Jun 1 - Sun, Jun 7

None of my ECG classification experiments have good results using the transformer architecture, despite lots of hyperparameter search.
I gave a Edmonton Python Meetup talk on hyperparameter search frameworks on Monday, Jun 8th.
We received notification that our abstract was accepted into CinC 2020, and now I need to figure out a way to incorporate the traditional machine learning approaches with the transformer architectures (that are not working anyways).

Feeling particularly anxious and frustrated about the research lack of progress and abstract not matching current methodology dilemma.

Week 24: Mon, Jun 8 - Sun, Jun 14

I began writing up the four page conference paper, not using the deep learning approaches, but instead using gradient boosting tree ensembles on manually engineered features inspired by signal processing and natural language processing domains.
Additionally, rather than constructing figures for the paper using a image editing program (such as Inkscape), I opted to try out PlantUML and found their state diagrams more than adequate for my needs.
For generating the PDF from the tex files, latexmk, a package recommended to me by Eddie, replaced my old setup of Tectonic and texlive.

The Physionet challenge organizers released over 40,000 records that require analysis.
I will do a quick summarization of the data before proceeding with my classification methods (replicating old traditional ML approaches, then continuing to explore the transformer architectures).

Week 25: Mon, Jun 15 - Sun, Jun 21

I’ve been having some experimental setup issues, now that the number of files within the dataset files have increased.
These issues include RuntimeError: received 0 items of ancdata, which are referenced briefly in closed PyTorch issues.
I took a break from resolving this issue, but I suspect it will be resolved after increasing the number of file descriptors.
My MBP appears to still have the issue with the sporadic shutdown and restarts, despite the new battery and the multiple NVRAM/SRAM resets.
I purchased for myself a new Lenovo Yoga C740, which will arrive in the mail by the 26th.

Week 26: Mon, Jun 22 - Sun, Jun 28

In terms of number of weeks, we are half way through the year.
I’ve spent a lot of time setting up a new Lenovo C740 laptop, and running to various issues.
As an aside, in the blog post I mentioned that the display brightness hotkeys do not work, but they have started working (unsure what update fixed this).
I have updated my ECG outlier detection approach to be more robust to bad data, utilizing median filtering prior to bandpass filtering to reduce harmonic noise from large peaks.


Week 27: Mon, Jun 29 - Sun, Jul 5

I discovered a Python library for neurophysiological signal processing called NeuroKit2.
There was a minor issue that I caught, and I submitted a pull request that was successfully merged into their development branch.
It appears to be a promising feature extractor, taking roughly 1 second per record to extract a variety of heart rate variability metrics.
The default signal cleaning function is superior to my raw bandpass filtering and median filtering approaches.

I will finish up writing my ensemble classifier, using these new extracted features.

Week 28: Mon, Jul 6 - Sun, Jul 12

I made a few code quality pull requests to the NeuroKit2 library this week, notably refactoring all of the printed warnings to using the builtin warnings module.
Additionally, I have a set of classifiers trained (100 experiments), with corresponding plots and feature importances for the team to review.
I will write up a bunch of tests to ensure scoring function quality, as well as write some sample re-weighting logic to make use of the non-zero weights across the different labels.
Then, I will calculate the overall challenge scores using both approaches (raw labels, including label probabilities).
I still need to integrate tsfresh features into the 12-lead ECG record in a sane manner.

Week 29: Mon, Jul 13 - Sun, Jul 19

I was able to get a large new set of feature extractors working on the 12-lead ECG records, increasing my feature counts from ~400 to ~10000 features per record.
This has considerably increased the amount of time it takes to train classifiers, additionally there are new challenges with loading and saving the features to memory and disk respectively.
According to the challenge scoring function, these new classifiers are over twice as good as the prior iteration.
Currently I am investigating the different feature variance, thresholding, and selection methods to reduce this feature dimensionality prior to classification.
I took a break on Monday and played a lot of Crying Suns, an FTL and Foundation inspired tactics game with a good mobile port.

Week 30: Mon, Jul 20 - Sun, Jul 26

In an attempt to further improve my model’s classification score, I yet again doubled the engineered feature count to roughly ~19000 features.
This was done by adding full signal tsfresh features, rather than just an isolated PQRST tsfresh feature (prior week’s results).
Feature extraction time has now doubled again, taking multiple days to process the 43,101 records.
Dimensionality reduction, although improves the classifier training time, does not cut down on the bottleneck of feature engineering itself.

This week I will resume the paper writing, finish the experiments with these new feature extractors, and hopefully submit an attempt for the challenge.


Week 31: Mon, Jul 27 - Sun, Aug 2

I needed to refactor my code such that the feature extraction was better handling the larger dataset size.
The old approach was to use a multiprocessing pool, but the issue is that the pool’s map output is not iterable and requires the entire output data to be stored in memory.
I rewrote the feature extraction to rely on a set of processes and a queue, feeding into a dedicated worker that appends a CSV file on disk.
Feature extraction still takes on the magnitude of days, and I am still carrying forward with my approaches from the past few weeks.

I feel like I have hit a big pain point in this methodology. It is fairly time consuming to write this feature extraction code, little progress have been made on alternative methods of classification (although I await the papers and challenge winner’s submissions eagerly).

Week 32: Mon, Aug 3 - Sun Aug 9

I have continued running the 100 experiment run of the full feature extraction and classification configuration of my methodology.
Although I started last week Wednesday, as of now only 62 runs of the experiment have completed (using the med-arc supercomputer).
It takes roughly 80-90 minutes to train a single set of XGBClassifiers, even with the GPU booster.

That being said, I have enough information to populate the results section of my paper, with figures using the available models that I have trained.
I have submitted a run to the physionet challenge organizers, and after some minor tweaks a submission should be running.
It is unclear if the timeout is hard set, as I likely have exceeded the 72 hour training time period.

Week 33: Mon, Aug 10 - Sun, Aug 16

I received the official phase timeout notification late Sunday evening, which prompted me to eliminate an expensive feature calculation step from the tsfresh feature extraction library. (I swapped the default FC parameters with the efficient FC parameter dictionary).
Currently resubmitted the code and rerunning the feature extraction again on the super computer.

This week will be setting up the three portions of the thesis experiments; classification, infilling, and encoding/bottleneck representation.
Classification is mostly complete, as it is the task of disorder detection given an ECG. Infilling would be an unsupervised task that completes ECGs with missing leads or missing segments in the signal.
Encoding/bottleneck representation is an idea for noise removal and potentially better classification.
I have not yet flushed out the details of how these three portions will overlap, as the majority of my time has been spent solely on classification alone, given the challenge.

I rooted my phone this week also. I am disappointed that I cannot record my phone calls, due to an open (but unaddressed) Google issue.

Week 34: Mon, Aug 17 - Sun, Aug 23

The Physionet challenge official phase submission deadline is this Sunday, Aug 23rd.
After discovering a major new time save, I was able to submit three new entries to the competition.
The time save is from not generating all ~18k features but instead only generating the top 1000 relevant features (using the large pretrained models as the feature importance priors).
Now that the challenge is wrapping up, I need to flush out the other components of the ECG related research, moving away from record classification towards infilling and autoencoding methods.

I additionally enabled the call recording functionality on my phone by loading the application as a system app (using di72nn/callrecorder-axet).

Week 35: Mon, Aug 24 - Sun, Aug 30

I’ve submitted the PhysioNet paper early to make it eligible for the preprint.
I’ve focused my time back to neural network approaches for ECG record analysis.
Currently, I’ve reproduced some LSTM auto encoder examples (originally intended for audio, single channel waveforms).
The tutorials for FastAI2 were decent for a beginner machine learning practitioner, but the API redefines multiple low level concepts from PyTorch, making it less attractive to me than other existing solutions, like PyTorch Lightning.

Additionally, I’ve setup a local Matrix/Synapse server using the apt package manager on my cybera instance.
I have configured a local Telegram bridge such that my Telegram chat is puppeted to my matrix account, allowing me to do all of my Telegram communications on a single app (Element).


Week 36: Mon, Aug 31 - Sun, Sep 6

A lot of last minute changes needed to be made for the four page challenge paper.
The long weekend (Labor Day Monday) was spend revising the paper according to some last minute comments.
The biggest concern was the lack of an internal hold out test set for our metrics- I report my experiments using only the validation set split.
I filmed a video presentation for this paper and submitted it to the conference as well, satisfying the remote presentation component of this conference.

The autoencoders that I have created for 12-lead electrocardiogram signal compression don’t seem to capture the signal representation well, even when using spectrograms to represent the signal.
I know that existing research works on the isolated PQRST window for single lead ECGs.
My research peers and supervisor suggest that I replicate existing methods using our dataset, which require reducing the input space to single peaks and leads.
I would eventually like to get multiple peaks and multiple leads working.

Week 37: Mon, Sep 7 - Sun, Sep 13

This week I implemented a working symmetrical linear autoencoder for the analysis of 12-lead ECG beats.
The biggest contributor to the improvement in my neural network involved the additional preprocessing of the input data.
I no longer use the provided sampling rates and raw signal directly, but instead use the limited R-peak windows and apply an l2 normalization on each of the samples.
I am considering reducing the scope of my thesis to only do classification of ECG records (using multiple approaches).
I already have multiple neural network architectures and shallow learning classifiers that I can reuse.
This will require less additional project designs and work and I believe will still make a compelling thesis.

Additionally, I received my “Cracking the Coding Interview” textbook in the mail this week.
I have re-read the initial chapters and began working on the practice problems listed in the book.
I am very rusty at these types of challenges and will require plenty of review.
The challenge book provides a broad and excellent overview of the core software developer’s concepts required for most interviews, and I expect to complete the book by the end of the year.
As an aside, I don’t expect to get the mobile application developed- I don’t have any app that I particularly wish to build at this moment.

For next week, the PhysioNet/CinC challenge requires me to attend my remote video presentation in order to answer Q&A sessions after the video.
This is unfortunate because my talk is at 12:30pm CEST time, which is equivalent to 3:30am MST time.

Week 38: Mon, Sep 14 - Sun, Sep 20

This week, I ported all of my dataloader and dataset code to use zarr, a Python package for compressed N-dimensional Numpy arrays.
It allowed me to greatly speed up my neural network training times and reference arbitrary length arrays using memmap, despite taking up gigabytes of space.
I need to continue working on the dynamic sequence length autoencoder portion of my experiment, using LSTMs.
The final challenge results have been released and our methodology attained a test set score of -0.080. We ranked 35/40th.

As an aside, I updated my phone to Android 11 this morning.
This had the unfortunate consequence of removing root from my device.
I will be spending some time today to revert my phone back to Android 9/10 and restoring root permissions.

Week 39: Mon, Sep 21 - Sun, Sep 27

This last week has been getting the LSTM autoencoder and classification neural network working for ECG recording classification.
Last minute paper revisions to the CinC challenge were necessary due to a organizer posted discussion forum post citing how all submissions needed corrections.
Additionally, I revisited my resume and updated it with my new machine learning skillset.
Hopefully it is competitive and opens the door to many interviews.

This week, I will rerun the autoencoder classification experiments multiple times, try to make sense of the disorder embeddings, and plot all of the classification score metrics.
I also intend on writing the working draft of the ICASSP paper.


Week 40: Mon, Sep 28 - Sun, Oct 4

I have the experiments running for the Conv/Linear + LSTM autoencoder classifier for electrocardiogram classification.
It is not very quick, requiring approximately 10 hours to finish one run of the three experiment variations (beat, sequence autoencoder, sequence classifier).
That being said, the experiment results are promising and the data that I have generated are sufficient to write a compelling paper.

I’ve also submitted a few applications for jobs, fine-tuned the resume, and met with a few founders and recruiters to discuss potential next steps.
This week will be converting my experiments into the IEEE paper for ICASSP.
Afterwards, I will compile the research I’ve been working on in these last months into a thesis for my Master’s degree graduation.

Week 41: Mon, Oct 5 - Sun, Oct 11

I have completed the first draft of the ICASSP paper and have reviewed it with Amir.
Amir has graciously helped me by designing the methodology figure showcasing how the signal processing outputs connect with the two phase heartbeat and sequence autoencoders.

Over this week, I had completed a challenging Amazon online coding assessment with lukewarm results.
I was unable to get the most optimal solution for Q2, a dynamic programming problem, within the alloted time period of 105 minutes.
This was partly due to the fact that I had a technical issue involving copy/paste that deleted all of my source code, costing me a precious 5 minutes.
I solved this problem after the assessment finished, and sent the solution (with corresponding runtime complexity analysis) to my recruiter an hour afterwards, and was luckly still moved ahead to the next phase of interviews.

This week I will be revising the ICASSP paper, continuing the thesis manuscript draft, and sending more job applications out.

Week 42: Mon, Oct 12 - Sun, Oct 18

This week has been a gauntlet of job interview applications, polishing the ICASSP paper for submission, and algorithms review.
I created a comprehensive software interview preparation guide to help me manage the technical questions and competency soft-skills.
Although I have the majority of the thesis related work finished (from these two papers), additional work of compiling everything into a cohesive singular document remains to be done.

From Oct 19th to the 23rd is Edmonton Startup Week.
I will be going through and engaging in as many of these events as I can, as I believe that it is important for long term growth of my self and will potentially open some job opportunities for me.

I had a good long chat with my accountant, as my corporate tax year end is October 31st.
I told him how my company was essentially a zombie, bleeding out monthly recurring funds and generating no profit.
By this time next year, if there is no further activity, the company will have no value aside from its name.
He told me that he knows my work ethic and intelligence, and that although an employee relationship is noble, that I do have the capacity to succeed in entrepreneurship.
This recollection of the talk does not fully capture the kindness and care that was conveyed to me.
I feel as if I am once again back at the crossroads and there is no certainty in my next steps.

Week 43: Mon, Oct 19 - Sun, Oct 25

This week was comprised of back-to-back job interviews, phone screens, technical assessments, and Startup Week (from Startup Edmonton).
I underestimated the challenge of finding fulfilling work- even though I am nearing the completion of my graduate studies and have attained the deep learning/machine learning skillset, it seems likely that the career I end up in will focus primarily on application/web development.
I don’t think this is necessarily a bad thing, but it’s a lateral step.
It would be better to have positions that can utilize my abilities in a more encompassing manner.

As an aside, we finally received a full SQL script containing production data ECG traces from Philips ECG machines.
I decoded the values and converted the encoded signals into a raw voltage over time reading successfully.
This week will be porting over all my papers into the thesis and writing addendums to tie the entire work into one cohesive unit.


Week 44: Mon, Oct 26 - Sun, Nov 1

This week was once again a big mash of interviews, job assessments, and tieing up loose ends on my master’s thesis.
I am grateful to have attained a handful of compelling and generous offers from multiple companies- I do have a rank ordered list of the positions weighing total compensation, long term stability of the organization, estimated culture fit, and task interest/complexity.
Lots of time was spent writing background information relevant to the different diagnoses for the electrocardiogram classification task.
Each label now has a corresponding figure, showcasing how the signals look for visual reference.

I will continue plugging away at the thesis, with the goal to have all but the last experiment ready for supervisor review.
One experiment requires re-running with the feature extraction step performed again, with an new idea for isolating important features per label rather than amalgamating all important features across all classifiers.
I also need to mix in the sequence autoencoder embeddings and see how that effects my results.

Additionally, my corporate taxation year end is October 31st, so I need to prepare documents for my accountant.

Week 45: Mon, Nov 2 - Sun, Nov 8

Three days of this week was spent completing a takehome assessment (Senior Software Engineer) position.
I wonder if it is partly due to my skills being rusty, but it was a very time consuming ordeal.
The large amount of time spent was in project setup.
This includes things like configuring docker/docker-compose, initializing the starter images, setup of test framework/linters.
I wonder if future assessments should be opinionated enough such that a base set of project files are provided, rather than starting candidates off with a pure blank slate git repository.

I received another request to do a comprehensive takehome, with one week deadline.
A rough estimate of the task is around 2-3 full days.
It is significantly cutting into my thesis writing and research time.
I have finished running the 18k feature training experiments, but now I need to run the top 1k (possibly top 100 as well?) feature extraction and re-training experiments.
Then I need to generate the figures and write the final thesis chapter, get the revisions from Abram, then submit the finished product to FGSR.

It snowed 15cm over the weekend, and I also have early morning commitments that require driving on Monday (Nov 9th).
Long term is pretty short for me at this moment.

Week 46: Mon, Nov 9 - Sun, Nov 15

Because I left the house very early, driving on the Monday morning was not as bad as expected, despite the icy roads and bad conditions.

I have completed an additional takehome for Intuit’s Senior Software Developer and Software Engineer 2 positions.
Additionally, I opted to make all my assessment source codes public and open sourced everything (through Apache v2.0).
I was contacted by additional founders and recruiters for further video chats and technical assessments, which I will be completing throughout the week.

The thesis has words for all sections, from introduction, background, the three experiments, and a conclusion.
The cohesive unit has been sent to my supervisor for criticism and feedback, but I do not anticipate major changes or any re-execution of experiments to occur.

The primary focus this week will be to continue the job search and to be mindful that I have committed to various companies that a decision will be made prior to the beginning of December.

Week 47: Mon, Nov 16 - Sun, Nov 22

This week contained the last stretch of interviews and take home assessments that is necessary prior to making a final decision for post graduation employment.
(Final decision for company for employment must be decided by November 30th, due to competing offers and existing deadlines.)
Further finalizations have been made to the thesis and resubmitted to Abram for review.
Full label-wise feature importance utilizations and F1-scores added to thesis appendix.

Wished my father well wishes and happy date of birth this weekend.

Week 48: Mon, Nov 23 - Sun, Nov 29

I have made the final decision for post graduation employment.
Decided to accept an offer from Intuit as a senior software engineer.
No further revisions were requested to the thesis, and a preliminary poll for thesis seminar and defense date has been sent off to all the committee members.

I spent some time adding continuous integration into torchprof, as well as some time investigating hexo as a new static site generation tool.
I am interested in having first-class support for server side mathematics, rather than relying on client side katex to generate the markup.
Next week will be writing up a seminar presentation (going to spend some time playing with reveal.js instead of using a simple google slide presentation).


Week 49: Mon, Nov 30 - Sun, Dec 6

This week I worked on the seminar and thesis defense presentation slides.
I have officially sent off the notification of the thesis defense to the Computer Science Graduate administrative staff, informing them that my public seminar will be performed on January 5th, 2021 at 1pm MST.

I spent a lot of time playing with teddit, an open source project designed as a ‘proxy’ for reddit that does not require JavaScript for functionality and respects user privacy.
There is really impressive functionality that enabled the expanding and contracting of comment chains, done entirely using HTML and CSS.
Otherwise I am delaying the transition of the theme to the new Hexo site, due to unspecified head injection of some script tags and a meta tag (indicating the generator used) that I cannot remove easily.
I anticipate that it will require forking the program, or modifying the default set of plugins used by the static site generator.

Week 50: Mon, Dec 7 - Sun, Dec 13

A lot of time was spent revising the seminar and thesis presentation slides.
Although the public presentation is only 1 hour long (including questions), I have a lot of material that I need to address.

I spent some time over the weekend making contributions to my torchprof library, updating the package to support the new self cuda total and memory fields offered in the PyTorch 1.5+ versions.
It is not trivial making the library backwards compatible- I have a lot more respect for the engineers that need to manage all of this backwards compatibility with non-trivial codebases.

One of the things I want to play around with this coming week is the NVLabs/stylegan2-ada repository (see paper Training Generative Adversarial Networks with Limited Data).
Additionally, I have de-prioritized migrating over my static site to Hexo due to the static site generation quirks (unknown source of inline javascript, kludged in meta tags).

Week 51, Mon Dec 14 - Sun, Dec 20

Abram has provided me feedback on the slides with some revisions that I need to incorporate- essentially the presentation is too text-heavy and will require a lot of hand holding to accurately convey the ideas and results.

I played around with StyleGAN2 and trained a model on a 20 second selfie video of my face.
More information is listed in my post [Selfie StyleGAN2](/2020/12/selfie-stylegan2).

Week 52, Mon Dec 21 - Sun Dec 27

After 52 weeks of keeping a resolution log post, I have come to terms with my successes and failures.
In terms of successes, I have the thesis defense scheduled for January 5th. Pending any defense provided revisions, my portion of the MSc is largely complete.
For half-successes, I have committed to maintaining intermittent fasting.
Although not a ‘Fast-5’ schedule, I have restricted my eating window between 11am and 7pm.
I am also not as committed to the daily five days a week fitness blender exercising as I would have liked, although I still get in at least 2 days of exercises per week.
Due to COVID-19, the public climbing spaces have been shut down so this resolution has largely been unfulfilled but out of my control.

I don’t think that resolutions with strict criteria and rubrics are an effective approach for long term change.
The biggest limitation is the rigidity and inflexibility of the set rubric.
The span of time that one year encompasses is paradoxically long and short.
In one year, I have accomplished an entire research thesis but I have also stalled in many other aspects of my life.
Moving forwards, I feel that I would like to loosen the restriction of the rubric and instead set more dynamic/fluid aspirations and goals.

This week I primarily played video games and enjoyed my holiday time off.
I ran memtest86 on my home desktop server and discovered multiple RAM errors.
Painstakingly testing each 2X16GB pair, I narrowed two pairs of RAM that consistently showed errors.
I am grateful that I had the foresight to purchase the four year in-store replacement and will get no additional cost replacements.

Starting next Monday, I will be employed as a software developer.
All in all, despite the world chaos that was 2020, I recognize that I have had an extremely privileged and fortunate position.
My situation and research meant that I could remain effective, despite working remotely.
All of my basic needs remained easily met despite the lockdowns.
I never feared any financial instability or problems due to loss of income.
Having a life partner who shares the living space with me proved to be wonderful and joyous.
No resentment or regrets manifested through long-term exposure and confinement.

Here’s to the end of 2020.
May the coming year be an improvement on the last!