Challenges in Combinatorics on Words (Day 4): Bus theft edition

So today was an adventure for reasons unrelated to exciting developments in combinatorics on words.

  • More talks and pretty proof heavy, which I thought I’d enjoy, but for someone who’s not in the field, it was kind of tedious. It was interesting to see that conjectures do get proven, I guess.
  • Theoreticians in CS love complexity measures, so we had two today! Antonio Restivo defined a complexity measure based on periodicity and Jörg Endrullis talked about comparing two different infinite words by using transducers. The transducer thing was pretty interesting because it’s more automata stuff and because there are so many natural questions that arise that haven’t been worked on very much yet.
  • Also, problems were getting solved during the workshop. Steffen Kopecki mentioned that him and others had solved some cases of Thomas Stoll’s problem, which asked if there are infinitely many odd $n$ such that $s_2(n^2) = s_2(n) = k$, where $s_2(n)$ is the sum of binary digits of $n$.
  • I finally got an experience of stereotypical Malvern life, in which my phone got stolen on the bus right as the hooligans were leaving the bus. I chased them down and I guess I was faster than I looked because they looked back and went “oh shit” and one of them decided they needed to stop me so they pushed me.
  • I chased them a bit longer but stopped because I was feeling tired and I realized my knee was actually bleeding really badly, which one guy who was walking home pointed out. That guy was good people and let me into his home to treat my wounds, provided wifi to see if I could track my phone down, and a phone for contacting people.
  • My dad picked me up a bit later and we decided the cut on the knee was pretty nasty so we went over to the hospital, which is my first experience with the Canadian healthcare system after being politically aware. Since my injuries weren’t that bad, I started keeping track of the dreaded wait times. It took about an hour before the doctor saw me and half an hour to treat and get stitches and maybe another half an hour for followup with cleaning and stuff, so it took almost two hours on the dot. That seemed reasonable but maybe I’ve been socially engineered by the communism. Also, didn’t pay anything.

Challenges in Combinatorics on Words (Day 3)

A short day today, with interested persons off to a visit at the ROM.

  • Now that open problem presentations are over, it’s mostly just talks and problem solving time. I don’t know if it was intentional, but today’s talks (other than the plenary talk) dealt mostly with algorithmic aspects of strings, which aren’t really my thing.
  • There was one talk which was particularly interesting, which was Florin Manea’s talk on finding hidden repetitions, which introduced the idea and motivation behind “hidden” repetitions. We want to check for repetitions of a particular factor $x$ or $f(x)$, where $f$ is an involutive (anti-)morphism. This problem actually comes out of the DNA setting, where words are taken over $\{A,C,G,T\}$ and taking the Watson-Crick complement of a word is the involutive antimorphism we’re interested in.
  • Jason Bell gave two plenary talks, one yesterday and one today, on algebraic aspects of $k$-automatic sequences. I’d read about $k$-regular sequences before out of interest but didn’t really retain much of it and I’m glad that I got a chance to have someone actually explain how to derive them from the idea of $k$-automatic sequences and also what the $k$-kernel is.
  • For lunch, it was raining and I didn’t feel like walking all the way down Spadina to King’s Noodle so I decided to try Kom Jug Yuen. It was more expensive and not as great as I was expecting. I’ll just walk to King’s or Gold Stone again next time.
  • The Fields Institute keeps all of its mathematicians and visiting mathematicians very well caffeinated and fed throughout the day. I think they have a scheduled coffee break at 3pm-ish because a bunch of people that I didn’t recognize were always around the coffees and foods and talking about math that I didn’t recognize. For coffee, they’ve usually got some combination of Starbucks and Timothy’s. For food, they have a wide selection of fruits and cakes. For breakfast, they have a platter of baked goods. I have also seen a platter of pita wedges and some kind of nice bread with various delicious dips.

Challenges in Combinatorics on Words (Day 2)

More open problems and talks!

  • There were two talks and a bunch of open problems by Aleksi Saarela and Juhani Karhumäki on $k$-abelian equivalence. So you have your alphabet $\Sigma = \{a_1,…,a_m\}$ and two words $u,v \in \Sigma^*$ and $u = v$ if they’re the same, which is obvious. We have this notion of abelian equivalence, where we have $u \equiv v$ if $|u|_a = |v|_a$ for every $a \in \Sigma$. That is, $u$ and $v$ have the same number of each letter ($aaabba$ and $ababaa$ are abelian equivalent since they both have 4 $a$s and 2 $b$s). We generalize abelian equivalence to $k$-abelian equivalence by saying that $u \equiv_k v$ if $|u|_x = |v|_x$ for every factor $x$ of length up to $k$. A lot of the problems that were posed were questions of how to extend properties that we know for the normal case and the abelian case to this new $k$-abelian setting.
  • The room that we’re in at the Fields Institute has a neat projector setup, where it uses two screens. The right screen displays whatever is currently displayed on the computer, while the left screen displays what was previously the current screen. This is really useful, because speakers tend to go through their slide decks a lot faster than I can write and often refer to definitions and theorems stated on the previous slide. However, the system has an interesting quirk: it somehow detects when the screen changes, which works for most presentations, since they’re static slides, but there was one presentation where the speaker had a slide with an animated gif or something on it and the left screen kept updating.
  • There was a problem from Štepán Starosta that dealt with extending things we know about palindromes to generalizations of palindromes. So instead of considering the mirror or reverse operation, what you’d do is consider a finite group of involutive morphisms and antimorphisms (an involutive function $\Theta$ has the property that $\Theta^2$ is the identity function).
  • I met a prof who happened to do his undergrad at Waterloo and is currently at a university overseas. We had a nice chat about various flavours of CS double majors and students chasing trends to make monies (as it turns out, CS/C&O wasn’t always popular).
  • I think I can articulate now why I feel useless in the problem solving sessions. While I know a bunch of results and definitions, combinatorics on words really is a pretty different field from automata theory or formal languages. So, since the basic “language” of the two fields is the same, if someone walked me through a proof or something, I’d be able to follow it. But when it comes to working on problems, even though the two are related, there’s an intuition to these kinds of problems that I haven’t developed yet nor do I really have a feel for how results are connected or what certain properties might imply.

Challenges in Combinatorics on Words (Day 1)

Workshop blogging! Very exciting, since I’ll try to reconstruct some highlights from my awful note-taking for each day.

  • One of the neat things about this is that unlike a “real” conference, there aren’t many results presented. Instead, the focus is on open problems and working on those problems. Essentially, what you have is very smart people coming up and talking about a problem that they had trouble solving and all of the things they tried before they got frustrated and gave up or something.
  • Luca Zamboni presented an open problem involving factors of an aperiodic infinite word and palindromes. An interesting tidbit was when he described how to use palindromes to describe a word. Basically, you say that certain positions of a word are palindromes and you try and fill in those spots with letters. So the question that comes up is trying to figure out what is the fewest number of palindromes that’s necessary to describe a particular word.
  • Eric Rowland talked about $p$-automatic sequences and deriving an automaton from some polynomial which describes a $p$-automatic sequence. We know how to get the polynomial from an automaton, but coming up with an efficient algorithm for the other direction is tricky.
  • Neil Sloane gave a neat talk about curling numbers. If we have a word $S = XYYYY \cdots Y = XY^k$ with factors $X$ and $Y$ for some finite $k$, then the curling number of $S$ is $k$. We can define a sequence where the $n$th term of the sequence is the curling number of the previous $n-1$ terms. There are a bunch of interesting conjectures that arise from this sort of thing.
  • Also, he really likes sequences, which I guess is what you’d expect from the guy who started the Online Encyclopedia of Integer Sequences. I was in his group for dinner and he spent much of the time introducing various sequences to us and we spent a lot of it playing around with them.
  • I was pretty much useless during open problem solving sessions because of a number of reasons (tiredness, lack of experience in the field and problems, overheating from sitting in the sun). But, I did watch a group work on a problem having to do with unbordered words and factors and it was nice knowing that a bunch of international experts worked on problems in much of the same way I do: by writing stuff on the board and staring at it for a while.

How Toronto’s War on the Church™ ended up going

I should start by noting that I’m by no means an expert on planning or urbanism at all and I’ve only been following this issue whenever it’s popped up. I’ve tried to go through whatever I can of the respective documents and files, but there’s only so much I can understand as an amateur. Basically, the best I can do is read and try to follow what happens at council so that’s what I’ll be focusing on.

So a few months ago, I noticed this thing scary graphic being passed along on Facebook about how Toronto was declaring war on the church or some such thing. Basically the war was conducted on two fronts:

  1. The harmonized zoning bylaw
  2. The Toronto District School Board raising rents on religious groups by some inordinate amount

I’ll be focusing on the harmonized zoning bylaw. First, a bit of history is necessary to put everything in context.

As you may or may not remember, what we now know as the City of Toronto used to be a two-tier municipality consisting of six different cities (Scarborough, North York, East York, York, Etobicoke, and Toronto) and a regional layer of government on top called Metropolitan Toronto. Everyone was happy with this arrangement, so obviously, the provincial government needed to wreck it.

Sometime during the first term of Mike Harris’ Common Sense Revolution™ Progressive Conservative provincial government, it was thought that Toronto (and a few other cities around the province) could run more efficiently as one giant city instead of a bunch of different cities. And so, in 1998, the Government of Ontario decided to smush all of these cities together even though no one wanted it to happen and here we are today, with one giant City of Toronto. Obviously, having to merge six different governments together into one giant government is not a trivial task and even now, 15 years later, we’re still trying to work out the kinks. One of those kinks is planning and zoning regulations.

You see, because Toronto used to be six autonomous cities, this means that all of those cities each had their own sets of planning regulations. This is obviously not ideal. So in order to try and simplify things (or at least make them less unwieldy), the city tried to work on harmonizing the bylaw across the city. This has been a work in progress for many, many years and almost happened in 2010 but it kind of blew up and everyone went back to the drawing board and here we are again.

Now a few months ago, someone found out that the newest version of the proposed draft zoning bylaw turned out to severely restrict the zones where places of worship could be established. Even though the immediate reaction was over the top spiritual war rhetoric, the concerns weren’t unjustified. Essentially, places of worship were limited to select commercial and institutional zones and that was all, no residential or industrial zones. Was it intentional? Was it a mistake? Who knows? But it’s helpful to remember that planning staff was trying to go through an incredibly complex set of regulations and trying to make everything somehow work together.

For those of you who aren’t familiar with how City Council works, essentially, stuff starts out in the various committees before heading out to the council floor. And so, religious leaders and groups went and got in touch with their councillors with their concerns and went and deputed at Planning and Growth Committee meetings and the bylaw was revised into something much more reasonable before being shipped off to council. In other words, there was something that was overlooked by someone, interested and concerned parties gave input and worked with their representatives, changes were made, and civic governance worked as intended.

With that done, we fast forward to the April 3 meeting of Toronto City Council. At this particular council meeting, the mayor made the zoning bylaw and Hero Burger at Nathan Phillips Square his two key items. Most people will remember the second one because councillors basically argued about whether to put a Hero Burger in Nathan Phillips Square for two or three hours and it featured the deputy mayor reading a selection of items from the menu of Hero Burger among other things. But before the Hero Burger shenanigans started, a pretty healthy chunk of time was spent dealing with the zoning bylaw and within that debate, there was a substantial amount of stuff dealing with places of worship.

As was mentioned earlier, initially, places of worship really were significantly impacted negatively by the proposed changes. However, all of that got significantly reworked and when it hit the council floor, it was something much more reasonable. The proposed bylaw now allowed for places of worship in all residential and commercial zones, various institutional zones, and industrial office zones. This was mostly fine, except for some fighting over whether to allow places of worship in light industrial zones.

The context behind this particular scrap is that a common thing for smaller churches to do is to rent or establish their church in areas which are zoned for industrial use because the cost of doing so is a lot cheaper. However, this puts them at odds with the city’s attempts at trying to preserve its industrial lands. What tends to happen is because the land value in these zones tends to be cheaper, condo developers often buy up these lands and try to get zoning changes on the lands. The result is that there are fewer and fewer places in the city where industry can set up operations.

Of course, churches don’t tend to be huge developers or speculators buying up cheap land to flip over to developers, so what’s the problem with letting them on industrial lands? The problem is that places of worship still negatively impact the use of industrial lands for industry. The reason for this is because a place of worship is classified as a sensitive use under provincial regulations and so the surrounding industry has to restrict their industrial activities, even though they’re in an industrial zone.

The particular motion (Motion 3, Part 3) to allow places of worship on light industrial zones was eventually lost and the initial recommendations from Planning and Growth Management were basically passed. Of course, this doesn’t meant that churches are suddenly getting booted from industrial lands. Most churches that are already there legally based on whatever bylaw was in effect before gets grandfathered and gets to stay there. It’s just new churches won’t be able to move into industrial zones.

So tl;dr, everything worked out in the end and it’s going back to staff for one more go-over before being finalized for reals.

Twitter bots, twitter bots, twitter bots, folks

After the incredible success of @SomeHonMembers, I decided to create @HonSpeakerBot, which was not nearly as popular, but whatever.

The lack of any transcripts or any data made a bot for #TOpoli difficult. But now, there are two. You may have seen them around as I was testing them.

Mayor Robot Ford hates streetcars

This idea is based on a popular Japanese twitter bot by the name of @akari_daisuki. What Akari does is takes a random Wikipedia article title or something from her timeline. Let’s call this thing $x$. Every fifteen minutes, she tweets the Japanese equivalent of “Yay $x$, Akari loves $x$”.

The idea behind @MayorRobotFord is similar. He takes a random Wikipedia article title or something from the #TOpoli stream and tweets, in his familiar way, “$x$, $x$, $x$, folks. We’re getting $x$.” or “People want $x$, folks. $x$, $x$.”, depending on how long $x$ is.

How does it work? Well, the Wikipedia portion is easy enough. We just get access to the API to grab a list of ten random pages. The more complicated part is pulling stuff off of #TOpoli.

Since this is a twitter app, it’s not too hard to get a bunch of tweets off of #TOpoli. We just use the API and we’ve got the fifteen latest #TOpoli tweets ready to be used. The difficult part is extracting noun phrases, or NPs, which is where that graduate class on computational linguistics comes in handy.

So how do we do this? Well, first of all we have to identify the parts of speech in a given tweet. So we tokenize it first and split it up into words and punctuation. Then, we use a part-of-speech tagger to go through and figure out what each little piece is. The POS tagger that I used was the default one that came with the Natural Language Toolkit. Normally, you’d need to train a tagger on a corpus. This default one was trained on the Brown corpus, which is a body of text which was hand tagged for training purposes.

So now our tweets are all tagged and we assume that they’re properly tagged. There’s obviously going to be some slight errors here and there, but whatever, we want to make a twitter bot, so it’s not that important. But we only have our parts of speech. We want to be able to relate the different parts of speech into phrases. So we need some kind of parsing or chunking to put these pieces together into larger phrases that make sense.

For this, I used a bigram chunker trained on the conll2000 corpus. Like the Brown corpus for tagging, the conll2000 corpus is manually parsed and chunked for training purposes. What a bigram chunker does is it analyses every consecutive pair of words in a sentence to come up with a statistical model. It uses this to come up with the most likely NPs to arise from the sentence. We can then just pluck out all of the NPs the chunker identifies.

Once we have all of our NPs, we stick them in a list with our Wikipedia titles and randomly select one to use in our tweet. The Wikipedia API has a limit of 10 titles per call and the twitter API grabs 15 tweets per call. Thus, the chance of getting a Wikipedia title is at best somewhere around 2/5 of the time. However, that’s not taking into account removing entries that are too large. That quick calculation also assumes that there’s only one NP per tweet when there could be many, so in reality, the chance of grabbing something from #TOpoli is much more likely, which might be for the best if you want weird accidental metacommentary.

The Core Service Review

One day, I decided to look through the City of Toronto’s open data catalogue and happened upon an interesting entry called the Core Service Review Qualitative data.

Lo and behold, it was exactly that.

After some fiddling around with an Excel module for Python and figuring out how to split tweets that are larger than 140 characters, I let it go.

@TOCoreService will tweet one entry, randomly chosen, from the 12000 submissions, or close to 58000 answers. These range from short answers like “transit” or “taxes” to fairly lengthy responses.

So what’s the point of this bot? Well, the data is up there for anyone to read, which is nice for transparency and engagement. Of course, whether anyone who’s not city staff would want to read 13000 responses is another matter. But here, we pretty decent collection of opinions on what our priorities should be from real citizens. It’d be a shame if the only people who read them were city staff.

Making NFAs smaller

So, you might be wondering what I’m working on now. Basically, I’m looking at algorithms that are motivated by the idea of reductions of nondeterministic finite automata.

The problem of NFA reduction is basically to take an NFA and make an equivalent NFA with fewer states. The natural question to ask is whether we can find an equivalent NFA with the minimal number of states, which is the NFA minimization problem. There are some good reasons that we focus on the easier problem. The first is that unlike DFAs, there is no unique minimal NFA. The second reason is that NFA minimization is super hard, as in PSPACE-complete (if you know how NP is “hard”, well, PSPACE is “harder” or “really friggin hard”).

Well, okay, but what if we’re not so worried about getting it as small as possible and we just want to get the damned thing smaller. If we can’t guarantee that they’re as small as we can make them, is there some kind of measurement to tell us how far away we are? Or are there special cases of NFAs where we can get the smallest one? And it turns out the answer is probably almost always no. Of course, that won’t stop us because there reducing the number of states in an NFA is pretty useful.

There are a number of ways to do this and it’s not known which way is the best way, otherwise, we could work on approximation or minimization instead. A lot of solutions take the approach of turning the NFA into a DFA, minimizing it, and then turning it back into an NFA and seeing what we get. This is nice, because we know there’s a smallest DFA and it’s not too hard to find. The problem with this is that the growth of the number of states in the NFA to DFA transformation can be exponential in the worst case. We’d like to avoid this.

The idea is to try finding states that are superfluous. What do we mean by superfluous? Well, if I have a word $ababa$ and I can end up in either a state $p$ or a state $q$, then we probably don’t need two different states. Similarly, if we start in a state $p$ or a state $q$ and use up the word $aaaba$ to get to a final state, we might not have needed two different states for that. This is essentially the kind of thing we do in DFA minimization, but in that case it’s a lot easier because the state transitions are deterministic.

What we’d do formally is define a relation that captures this idea. For an NFA $N=(Q,\Sigma,\delta,q_0,F)$, we’d define some relation $R$ that satisfies the following conditions:

  1. $R\cap(F\times(Q-F))=\emptyset$
  2. $\forall p,q\in Q, \forall a\in \Sigma, (pRq \implies \forall q’\in\delta(q,a), \exists p’\in \delta(p,a), q’Rp’)$.

Condition 1 rules out final states being related with non-final states. Condition 2 tells us that if two states $p$ and $q$ are related, then every state that $q$ has a transition to will be related to some state that $p$ transitions to on the same letter. As long as these two conditions are held, then we can define any crazy old relation to work with and gather up our states into a bunch of states.

This is essentially what we do when we want to minimize DFAs. The difference is that it’s a lot easier to define this relation because transitions only have one outcome in the deterministic case. In fact, there’s a specific relation, called the Myhill-Nerode equivalence relation, which has the property that $L$ is a regular language if and only if the Myhill-Nerode relation has a finite number of equivalence classes. And these equivalence classes turn out to correspond to the states in the minimal DFA for $L$.

However, like was mentioned before, we have no such luck with NFAs. We have a lot of relations we can choose from and it’s not clear which one of these is the best or things like which combination or how to iterate them so that we can get the best one. This is where the hard part is, figuring out which of these things gets us the smallest NFA in the most efficient way possible.

Some hon. members: Oh, oh!

A while ago, someone said something on twitter and replied with “Some hon. members: Oh, oh!” For some reason (probably because I am a gigantic nerd, I thought this was hilarious and looked up what other interesting tidbits or convention were transcribed into Hansard.

If interjections give rise to a call for order by the Speaker, they are reported as “Some hon. members: Oh, oh!”
Hansard — Wikipedia

For my computational linguistics project I wanted to play around with Hansard as a corpus. I used the openparliament.ca database, which has all the statements made in the House that are available online (so since 1993) and has some convenient metadata. So I proceeded to dump the statements in the database, categorized by stuff like party or whether it was the Speaker speaking. Each statement had some metadata indicating who spoke and openparliament.ca has a ton of information about each Member of Parliament that’s scraped from PARLINFO.

While I was doing this, I remembered the “Some hon. members” stuff and wondered whether they had an id so I could dump all of those statements out. It turns out that statements by “Some hon. members” or “An hon. member” aren’t linked to a particular member or politician, even a placeholder one. That’s okay, since it was possible to grab all of that stuff with a query on the name instead of an indexed id.

Now I have all of these statements sitting around without context, so the obvious thing to do is to make a twitter bot.

How it actually works isn’t complicated at all. Everything just sits in a giant text file and a script pulls a line from the file at random once every hour. Since the vast majority of things that Some hon. members say are things like voting (yea or nay or agreed) or interjections (oh, oh or hear, hear), that’s what’ll show up most of the time.

I’ve also included things that An hon. member will say, so occasionally, there will be random heckling showing up. Because, you know, non sequiturs on twitter are hilarious. These are sometimes longer, so I made it randomly pull out a chunk of the statement, which has questionable results.

To be honest, I wanted to do something for Toronto City Council at first, which was why I asked around #TOpoli for something Hansard-like for council. Unfortunately, that doesn’t exist, so unfortunately, all of the amazing possibilities for council bots will go unrealized. On the other hand, there are a few more ideas I have for all of this Hansard stuff. And of course, there’s my actual project to hopefully look forward to as well.

Anyway, I’m glad people are enjoying it.

About that Mighty Middle

Back in fall, I had to do a project for my social network theory course. Not too long before that, I saw a neat post on CalgaryGrit that talked about how to identify similarly aligned groups and councillors on Toronto City Council based on their voting records. With the help of the guy who actually did that analysis and his scripts, I was able to compile my own data from Toronto’s council voting records which were conveniently offered as part of the city’s open data.

And here’s what came out:

This is a graph of Toronto City Council, where edges between two councillors means that they have a high degree of similarity in their voting records. The period considered is from the beginning of the term, December 1, 2010 up until September 30, 2011, which was the last day of voting data that I had available before I had to start work on the project. An edge means that the two councillors voted the same way at least 90%. An edge is coloured blue if that goes up to 92.5% and it’s coloured green if it’s at least 95%. Or you can think of those numbers as 10%, 7.5%, and 5% different. Same thing.

It’s important to note that the edges aren’t weighted. This means that the physical distance of the councillors doesn’t actually mean anything. That Rob Ford is drawn at the top right corner is a coincidence and it doesn’t mean that Denzil Minnan-Wong is more similar to the mayor than Doug Ford. Similarly, it doesn’t mean that Paula Fletcher is necessarily the councillor least similar to the mayor just because she’s the furthest away in the drawing.

Of course, the drawing is oriented such that you can make less fine-grained observations. It’s pretty easy to see which councillors are the right or left wing and which ones reside in the middle. We can also see that the right wing of council votes together a lot more than the left wing. We can even kind of identify which councillors are most likely to break with their respective groups.

In order to get more detailed analysis, we need to look at actual numbers. There are a bunch of graph theoretic metrics that we can use together with social network theory to talk about how certain groups or councillors might act. I get into that sort of stuff in my writeup. Of course, a lot of that is handwaving since I don’t really get hardcore into stats and a lot of it is political analysis, which I’m kind of an amateur at.

Interestingly, I concluded my writeup by saying something like how, based on all of the analysis and numbers, the Mighty Middle didn’t really show any signs of life. And even if it did, it wouldn’t get very far since the number of votes Ford had on his side was pretty stable and was at the point where he’d only need one or two votes.

Well, council sure showed me. One of the first things that happened in 2012 was the Mighty Middle that I said didn’t really exist covertly orchestrated enough votes to reverse a bunch of the mayor’s cuts. So what does this mean?

Well, the most obvious lesson is that you can’t predict what’ll happen in volatile political scenarios based just on data. Obviously, the situation seemed stable, both from the perspective of the data and people watching city hall. I mean, the whole budget thing surprised everyone.

Of course, the mistake there was to assume we were in stable situation when we weren’t. Yeah, the mayor had a lot of safe votes, but he was still missing one or two. Everyone’s been treating this as the mayor having an unfortunate stranglehold on council even though in a parliamentary setting, missing one or two votes is still enough to throw everything into uncertainty (see Queen’s Park). Being a non-partisan legislature, this volatility should’ve been more expected. But that tiny gap managed to fool everyone, even though all it’d take is one or two councillors to ruin everything for the mayor.

Interestingly enough, the Mighty Middle councillors did do what I said they’d be good at. They were able to use their position to broker a compromise that managed to peel off enough votes from the mayor. When they did combine their powers, they were really effective. But also notice that the coalition they forged was still really fragile. Even on the day of the vote, it wasn’t completely slam dunk for the opposition until the vote was done. All it would’ve taken to ruin everything was one or two councillors, which is something I did note in my writeup. Of course, like I said earlier, this caveat and margin of error holds for the mayor’s side as well.

And here’s where numbers aren’t enough to capture everything. Once someone decides to rock the boat, as the Mighty Middle did in late January, it becomes easier and easier. All of a sudden, the mayor’s grip on council doesn’t seem that bad and in February, we have the TTC chair and (former) Ford ally Karen Stintz turn rally council to overturn the mayor’s transit plan.

This is obviously a huge vote. Unfortunately, my model doesn’t weigh votes according to their importance, so this is treated the same as any other banal vote like voting on extensions of speaking time or something. I did throw in some stuff about possible ways of classifying votes, but that’s already hard to do in an objective way. Figuring out how to weigh the importance of votes is probably even harder to do automatically.

None of that changes that I was way off in my conclusion. Of course, I’m thrilled at what’s been happening at city hall, so I guess I should be happy that all of this happened right after I finalized my writeup and got marked on it.

If you’re interested in reading about how wrong I was, here’s the writeup.