UP | HOME

AISC 2025

Table of Contents

This page is about project descriptions, plans, and results of the Understand Intelligence AISC 2025 stream.

1. Related Documents 🔗

2. Organizational Things   organizational 🔗

2.1. Meeting Time 🔗

2.2. Matrix 🔗

You may need to verify your device to be able to see messages in the space. Goto settings->allsettings->sessions.

3. The Goal 🔗

The primary goal is to make you good at doing alignment research as quickly as possible.

4. What are the Important Research Skills? 🔗

What are the algorithms that somebody needs to have in their brain to be good at alignment research? What is the best way to put these algorithms into somebodies brain?

Based on my research experience the following seem important skills:

  • Reflecting
    • Consistently setting time aside to notice and solve problems, and amplify positive patterns. Any problem that when solved is making you significantly better at research is worth solving.
  • Reasoning programatically
  • Reasoning mathematically
  • Using writing to augment your thinking
  • Creating programatic environments that can be explored to learn new things.
  • Steering yourself at the important problems.
    • The ability to work on hard problems, instead of bouncing of toward easier less important ones.

Ultimately I want that you are able to tackle the hard parts of the alignment problem. Emperically it doesn't work that well to have people try to just solve alignment. One of the major problem: Evaluating your own ideas is hard. And once you are good at evaluating your ideas most ideas will either seem extremely difficult.

The primary focus therefore is to make you good at putting your ideas in contact with reality.

You'll be working on this on your own, whenever you have time. I recommend that you reserve a big chunk of time to work in this, instead of spreading the time out. You should tell me when you plan to work on the project such that we can schedule ideally 3 short meetings for every day that you plan to work on this project. One before you start, one in the middle, and one at the end.

Below you'll find a couple of sections. The Program: Programatic Exploration - Increasing the bandwidth between the researcher and Reality is the most important one which describes concretely what we will be doing. The others contain some considerations for how to go about doing such things.

5. The Program: Programatic Exploration - Increasing the bandwidth between the researcher and Reality 🔗

5.1. Stage 1: Create a Game 🔗

Your goal is to design and implement a game that adheres to the following constraints:

  • Deterministic
  • Discrete
  • Finite
  • One player
  • You are not allowed to clone a game you know.
  • The gamestate is fully obserable to the player.
  • Gamestate can be represented as text.
  • The game can be completed in at most 5 minutes by an experienced player.
  • The game can be scaled up arbitrarly.
  • It shouldn't be completely obvious to write an algorithm that can beat the game.
  • Ideally the following strategies don't work for implementing an AI that plays the game:
    • Greedy
    • Exhaustive search

Examples of games that can be scaled up arbitrarly.

5.2. Stage 2: Create an AI playing your Game 🔗

Create an AI that can play your game efficiently:

  • The AI can only take actions a normal player can take.
  • The AI can solve an as large as possible instance of your game in 1s.
  • The AI should not use any block box optimization techniques.

5.3. Stage 3: Reflect 🔗

  • What did you learn?
  • What features of the game make it easy to write an AI?
  • What features made it hard to write an AI?
  • What would you change if you could restart?

5.4. Stage 4 (optional): Solving a game Blind 🔗

Pick the game of another person and create an AI for it.

  • Don't look at the source code.
  • The source code is not allowed to run inside the agent (e.g. if I had a chess game that I am writing an AI for I'm not allowed to take the chess games source code and run it inside the agent to give the agent a perfect model of the game).

5.5. Stage 5: Creating an Environment for Exploring an Alignment Concept 🔗

  1. We will do John's Framing Workshop with alignment relevant concepts, to generate interesting ideas.
    • All generated ideas are collected into a shared document.
  2. Everybody picks an idea. Collaboration is encuraged.
  3. Design and implement a game like environment that can be used to explore the idea and the alignment relevant concept.

During the workshop you can choose whatever alignment relevant concept you like. Here are some examples that I think are alignment relevant:

The environment can be many things:

  • Creating an AI that solves the environment forces you do understand the concept better.

5.6. Motivation: The Power of Explorable Interactables 🔗

The main goal is to build information rich software environment Measurement_Devices">"microscopes" that we can get useful bits from. For the first game we want to focus on Distilling "Brain Algorithms" into Computer Executable Code.

Later we want to explore the general case that Distilling "Brain Algorithms" into Computer Executable Code is a special case of: Learning new things by exploring Interactables.

5.6.1. Distilling "Brain Algorithms" into Computer Executable Code 🔗

Summary: If you make it a game where you can solve the game by detecting the patterns, but you don't know how to write an algorithm that would detect the patterns in the same way you do, then you can learn how to write a new kind of algorithm that performs some cognitive task that you don't yet know how to write.

One of the main things we want to get out of the first game is for you to invent an algorithm. The goal is to optimize the game such that:

  1. Exhaustive search is intractable
  2. A human can learn the game and then beat it consistently within ~1 minute.
  3. You don't know how to write the computer executable code that would solve the game.

Now you can play the game a bunch and instrospect on your own cognition. The goal is to get evidence about what computations are you running in your brain that make you solve the problem. The idea is that we can use these bits to discover the computer executable code that solves the game faster.

The learning goal is to train the general skill of extracting a computer executable program from introspecting our own cognition.

For this exercise it doesn't matter whether somebody else has already come up with an algorithm that solves your game. It's only important that you don't know about it, and that you don't look it up, but find it through introspection.

Example:

The most important thing about the game is the mechanics, how does the player interact with the game. That's the thing we want to get at. And we don't want to get up at high-level descriptions of a fire extinguisher. We don't want to tell a story. We want to get at how the program works, how the player interacts with the program.

See Extracting Algorithms from the Brain to solve Negar's Cylinder Game for a concrete demonstration of doing this.

5.6.2. Distilling High level Reasoning "Brain Algorithms" 🔗

There are different levels of extracting brain algorithms. E.g. Negar did write down the algorithms that would play her cylinder game perfectly for every possible situation, and for every situation where there is no solution she proved that this is so.

This we could call a level 1 algorithm. An algorithm that given any stating configuration of a game with fixed rules will solve that game or say that it is impossible. We can call an agent that just executes a constant action sequence that works in only one particular starting gamestate a level 0 agent.

The next step is to find higher level agents. A higher level agent would not start with the hardcoded alogirthms that can solve any game. Instead it needs to learn these algorithms themselfs.

We can call a level 2 agent, an agent that knows:

  • We know the goal.
  • We know the exact rules of the game.
  • We know what each action does.
  • We know the current game state.

We also assume that:

  • The environment state only changes when the agent takes an action.

This agent can perform tree search to find the optimal action sequence. Now we want to adapt the environment that such tree search is intractable. We then want to find general algorithms that can learn the structure of the game.

Again one way to do this is to introspect on how you are going about learning the game. Try to extract these cognitive algorithms.

I expect that at the core of this lay general algorithms to construct models.

It's pretty unclear what a model is supposed to be here. We may say that:

  • A model allows us to predict how the world will behave.
  • Allow us to reason about the world at a high level.
  • Contains a list of properties that hold of the game.
    • E.g. that taking action 3 as many times as possible is a property of any optimal solution for Negar's Cylinder Game.

Another strategy:

  1. Implement an algorithm A1 that solves the game.
  2. Implement the algorithm A3 that you ran to produce the algorithm A2.
  3. Implement the algorithm that you ran to produce that algorithm A3.
  4. etc.
5.6.2.1. Example on Negar's Cylinder game 🔗

In the cylinder game action 3 is "best". It removes the most stones, and action 1 is the second best because it removes the second most stones. Action 2 is bad because it just add stones.

Given this we can device the following heuristics: "Use action 3 as much as possible, and only if we can't use action 1. Only if absolutely neccesary use Action 3." This heuristic dosn't talk about how to play the game, but about what properties a good solution would need to have.

Of cause we can also turn these heuristics easily in a greedy agent, that tries to apply action 1, 2, and 3 in that order.

We could now try to design an algorithm that figures out given a description of the game (what are the rules, what are the actions, what is the goal), a ranking of the actions like above. However, somehow when playing the cylinder game we noticed that giving a ranking to each action makes sense in the first place. How did we notice that? What mental algorithm did we run. It is not true in general that there is a natural ranking of actions. Should I move the queen to F4? Well that depends on the concrete board configuration.

Here our brain managed to notice that each solution needs to have the property that it uses action 1 as much as possible. If we could extract the algorithm that notices this kind of thing, it would be a more general algorithm than the algorithm that just tries to find a ranking on actions. This kind of algorithm is about creating a model of the game (in this case it put properties solutions must have in the model) such that this model is useful for reasoning about the game.

That is to say, what is the algorithm that when playing a game infers structural properties about the game, that are useful for thinking about the game more. This is a bootstraping process, similar to a bootstraping compiler. The algorithm would find strucutral properties and these structural properties are then helpful in thinking about the game better, which in turn makes it easier to find more structural properties. This process would iteratively construct a model of the game, which can ultimately be used to generate a good policy that would solve the game.

5.6.3. Learning new things by exploring Interactables 🔗

Everybody really confused about alignment. What is intelligence? How can you make a powerful intelligence "want" what you want? Does this question even make sense? So it's tempting to think "Before doing something as concrete as write source code that is trying to answer a question about alignment we need to deconfuse ourselfs. Without deconfusing ourselfs we are bound to write useless code, because we don't even know what question need to answer."

Hypothesis: This is confused. When somebody thinks like that they are imagining using programs in a very particular way.

There are different ways in which codifying your ideas can be helpful. Once you already have an idea you can codify it to see whether it actually works. This can be very useful, but if all your ideas are very confused you'll likely simply fail to write the code. Coding is hard and you might waste a lot of time.

But instead of using programs to express an already generated solution we can use them to augment the solution finding process. On way to do this is via very generic cybernetic augmentations, such as:

  • Writing an idea in a digital text document allows me iteratively refine what is written.
  • Setting a daily alarm to remember to do sport.
  • Transcribing a conversation with whisper in realtime allows me to remember how we ended up at a particular topic, and we thought it was important.

These are great but these are not what I am interested in here. Let's start with examples of the thing I am interested in:

Example - Interactive Video Explanation of Quaternions

3blue1brown and Ben Eater created an interactive video explanation of quaternions. At any point you can pause the video and mess around with the definition of the quaterion, which changes a 3D visualisation of a quaternion in real time. Playing around with quaternions like this is a good way to build intuitions.

Now imagine the scenario where you don't really understand quaternions, but understand them just enough to create a similar tool that allows you to interactively explore quaternions. You can now use this tool to discover new facts about quaternions, and build intuitions about how they behave.

Example - Cantor Dust

An example in this direction is cantor dust, a binary visualisation tool, that allows you to determine whether a sequence of bits is x86 machine code, a png, text, etc. by reprenesting the data in a format that the human visual cortex can process.

Imagine you want to create a taxonomy of file formats and you can't lookup what file formats exist. You can use this tool to inspect many files and quickly identify when you are looking at a file format that isn't in your taxonomy yet.

Example - Blender

When manipulating a mesh in blender you immediately see the effect of your inputs as you make them. Blender also has many settings for how to display geometry. You can move the scene camera, render objects as wireframes, show vertex colors or weights, display various gizmos. It it's video editor you can enable real time displays like a chroma vectorscope, or color histogram, that make color grading easier. As you change the color grading these real time displays immediately update. And all this can be done while playing the video.

Blender is an example of a program that facilitates the interative, interactive creation of various artefacts. One interesting program we might want to create, is one that similarly facilitates the creation of some specific artefacts, such that through the creation and inspection of the artefact we can learn something useful about e.g. alignment.

I want to create computer programs that we can explore in order to learn new things to increasing the bandwidth between the researcher and reality. We want to create interactables that when explored give us new bits of information about alignment relevant concepts.

What follows are a bunch of less central examples that still provide evidence that learning from programs can be powerful.

Example - Game Development

In game development you often start with an idea, implement it, and then notice that the game is fun a way you didn't model at all. GTA was originally meant as a police simulator, but then the developers realized that it's much more fun to run around and cause havoc in the city.

In general good gamedevelopers develop a game through constant conversation with the game. It's simply too hard to perfectly predict how it will feel like to interact with specific program. But that isn't to say that your models don't improve. By making many games with such an iterative feedback loop your models of what makes for a program that is fun to interact with. You'll still be suprised, not as often, and not as much.

Example - Stephen Wolfram Investigating Cellular Automata

Stephen Wolfram studied cellular automata for a long time. Often he describes the phenomenon of computational irreducability. He has a model of what the cellular automaton will do but his predictions regularly fail completely. He discovered once a cellular automata that was so random, that it was used for some time in the wolfram's language random number generator routine.

Note that this is not an interactable.

In general sometimes it is simply easier and faster to express an idea as computer executable code, to get our bits. The computations that generate interesting observations are simply too complex to be run in the human brain. Or at least doing so would be much slower.

I don't like how Stephen Wolfram is using the term computational irreducability. Clearly it's a real phenomenon, but when he fails to predict a cellular automata it could also be because his model isn't as good as it could be. And perhaps he thought longer and harder he would be less suprised, like in game development.

Example - Natrual Selection

Primer is constantly suprised about what outcome natural selection will produce. When you are suprised about something it means that your model isn't that good. Whenever you can create a computer simulation that suprises you, it's a potential learning opportunity. See also The Tragedy of Group Selectionism.

This is another example where you are are constantly suprised.

Note that this is not an interactable.

Example - Monty Hall problem

The Monty Hall problem is very unintuitive. There are people who argued at length that it doesn't matter whether you switch. Seeing through why you should switch is hard. But it's pretty easy to implement a stochastic computer simulation of the problem. By running it you can see that if you switch you are more likely to get the car. If the monty hall problem where unsolved, we can now with confidence try to understand why you should switch, because we now know that such understanding should be possible.

This is an example where the logical reasoning is harder to do than writing a simulation.

Note that this is not an interactable.

In terms of how to use this for alignment here is a rough idea for an interactable that might be useful for making process on the Tiling Agent Agenda.

5.6.4. Why create a new game? 🔗

I expect it to be much more fun, and also trains you being creativity.

5.6.5. Other Skills 🔗

Besides training how to design and implement information rich software environment Measurement_Devices">"microscopes" that we can get useful bits from, I expect you'll learn other generally useful skills for research:

  • Expressing your ideas in code
  • Refining your ideas in conversation with the code that expresses your idea.
  • Become good at thinking about and designing algorithms

Interactive programs can also be useful in different ways. One can design a game such that you yourself can solve it using your brain, but where you don't know the algorithm that would solve the task. Now playing the game yourself and observing how you are going about doing things can give you many bits of informations that help you in desiging an algorithm you couldn't before.

5.7. Demonstrations 🔗

5.7.1. Demonstrating how to Create a simple Terminal Game 🔗

5.7.1.1. Ideation: creating an environment for having ideas and having them 🔗

Here is a demonstration for setting a basic ideation environment, and generating an idea for a simple terminal game. The purpose of you doing similar is to get familiar with the entire workflow of generating ideas to having the executable code. At this stage we don't want to think about alignment too much. We first want put ourself in the position where can grasp the absolute basics on the technical side, such that it dosn't get in the way once we are thinking about alignment related issues.

The purpose is not to demonstrate the final result, but rather the process by which an idea is generated.

DO NOT COPY THIS IDEA! Ideally don't do something about shapes, and don't have a grid. Otherwise you'll not train your creative muscle.

The idea is that in the future I'll make a follow up video about how to go about implementing it.

5.7.1.2. Implementation 🔗

Here is a quick render of a the WIP video for the next part.

5.7.2. Extracting Algorithms from the Brain to solve Negar's Cylinder Game 🔗

This is a demonstration for how you can discover an algorithm by playing a game where you don't know the algorithm for solving the game, and then introspect on your own cognition.

To get the most out of this video it's reccomended to first understand Negar's cylinder game, preferably by playing it. Take the python source code and run it. The game explains itself when run.

Here is also a video of going through Havel-Hakami but this is less important than this video.

Chapters:

  • 0:00 Describing what we did previously: We can solve a subproblem with havel-hakami. New objective: We want to solve the remaining problem by extracting the algorithm our brain executes when we play the hame.
  • 1:52 Playing the Game.
  • 2:16 Writing down the strategy in code: Don't revisit states.
  • 2:42 Writing down the "computation trace" for what Negar did when playing the game.
  • 3:49 Johannes figures out how to solve a specific subproblem, and we then iteratively codify the algorithm.
  • 5:46 We give an "intuitive proof" of why this algorithm is optimal in solving the subproblem.
  • 6:39 Describing the outcome: We managed to extract simple algorithm from our brains. Probably this was faster than if we had thought about it abstractly.

5.8. Feeback on Work Recordings 🔗

5.8.1. Gustaf Recording himself 🔗

Here is an a video of Gustaf working, edited with auto-editor. (Original video length >1h.)

NOTE: The video is slightly broken by auto-editor because the audio was not normalized.

Most important feedback: Reflection is good. But here I think you did to much abstract reflection in advance. In some sense you haven't started the exercise yet. I expect it to be much faster you just start doing the task even while you are still confused. This forces you to focus on resolving the confusions that are most relevant for the task. Reflecting on a concrete task you have already attempted to do, gives you a lot more bits to work with.

Misc feedback:

  • 4:30 First going through the constraints and making sure that you understand them is good. Restating them in your own words seems like good general strategy.
  • You mention that in my demonstration video I did shoot myself down a lot less, and that therefore I could iterate more on my ideas. It's worth noting that I didn't do this on the object level that much, but I did do it a lot on the meta level. Especially in the beginning I did notice multiple times that what I was doing was too abstract and that I should do something more concrete.
  • Setting reflection timers seems very good.

Ways in which the Video Recording itself can be improved:

When talking to Gustaf we realized that the bottleneck was that he didn't want to generate a game idea. That's why he thought about it abstractly. Partly because he didn't know how to generate one.

I did the following exercise with him for ~10 minutes:

  1. Johannes: Say a random word.
  2. Gustaf: Tomato.
  3. Johannes: Turn the tomato into a game.
  4. Gustaf: The player could draw a tomato.
  5. This could be done with bezier curves.
  6. Or maybe the player needs to just draw a circle.
  7. Maybe you have shapes like circles, triangles and squares and you need to build a bridge.
  8. Maybe the player has a bunch of shapes.
    1. The player selects a shape, and a color for the shape.
    2. The background has an image.
    3. The player needs to place shapes ontop of the image such that the placed shapes approximate the image as closely as possible.

Afterward he had what I'd consider a novel game idea.

6. Game Design Considerations 🔗

6.1. Feedback Loops 🔗

A primary design goal for the types of games we are looking for is that they have extremely tight feedback loops. Ideally we get feedback in realtime, such that we can get feedback on how the game feels, and later feedback on if we are interacting with the game in the correct way to get as many bits out of from the interaction.

:TODO: E.g. you could have a game where the goal is to ask questions. The goal is to maximize the questions that you are asking The questions should be maximized

We want to have an algorithm that generates structures programatically that are then interesting to figure out. If we can write programs that figure out structure of these games it seems like you can make progress on figuring out structure in general, structure of the real world.

6.2. Tatham's Puzzle Collections 🔗

Negar send me this cool website with a bunch of little puzzle games that you can play directly in your browser. You can look at them to get inspiration, but please don't copy these games or their mechanics directly..

7. The structure of the Weekly Meeting   organizational 🔗

7.1. Part 1: Running the Code 🔗

I will ask everybody to run the code you made, and to demonstrate your progress by interacting with it. (Make sure that your code runs.) Everybody has ~5m to do this.

You can talk about:

  • What the game currently is.
  • The most important insights you had when reflecting on your process.

Consider sending the source code in matrix such that other people can play it.

Consider setting up a digital whiteboard that you can draw on when somebody asks you a question.

7.2. Part 2: Q&A 🔗

You can ask me any clarifying questions about the project in general, what the goal of particular exercise is, request quick feedback on a particular thing, etc. Anything that is likely to be relevant to all people.

7.3. Part 3: Whatever you like 🔗

People are free to leaf now. If anybody wants to do something that dosn't fit in the previous sections they can do it here. E.g. asking for more detailed feedback that might be relevant for everybody (not only to me but also e.g. about the game of another person).

8. Use a REPL 🔗

9. Recording Yourself 🔗

Imagine you're good at something and you look at what somebody did.

Gustav was watching a video of co-workers working and to copy text they would right-click, select copy text, right-click, paste text and would do that constantly because they didn't know CTRL-C. Looking at the code after it has been written doesn't allow you to easily infer that not knowing how to copy paste efficiently is a bottleneck.

Therefore record yourself while working, such that I can by watching the video give feedback on your process, which I expect allows me to say many more useful things.

It also allows me to automatically cut out all the silent parts, watch the video at 2x speed, and skip sections I predict are less important to analyse.

Robert explained that one of the best ways to get better at Leage of Legends, one of the best things to do is to watch your replays.

You watching the video yourself might also be useful.

9.1. Setting Up Recording 🔗

I recommend to use OBS.

9.1.1. OBS Audio Filters 🔗

The following settings ensure that the audio has the right volume and that noise is removed. This is important for auto editor to work correctly. You need to tweak the gain setting such that you don't max out the audio meter when speaking. All other settings can stay the same.

2025-01-18_17-49-20_screenshot.png

2025-01-18_17-49-31_screenshot.png

2025-01-18_17-49-44_screenshot.png

2025-01-18_17-49-56_screenshot.png

To add these filters click on the 3 vertical dots next to the audio bar:

2025-01-18_17-50-56_screenshot.png

And then select filters.

9.1.2. Use auto-editor 🔗

The videos become a lot better when we cut out the silence. auto-editor is a tool that can do this automatically for us.

I can also do it with the video you send me, but if you do it yourself it's even better.

Here is how you can use auto editor to cut out silent parts, but keep silent parts where something on the screen changes.

auto-editor --edit '(or audio:4% motion:0.0018,blur=0,width=1920)' some-file.mkv && auto-editor --edit audio:4% --silent-speed 6 some-file_ALTERED.mkv

9.1.3. Sending Files 🔗

When sending the video files please send them as a whole, using some service like gdrive (don't send them in element).

9.1.4. Scaling the Screen 🔗

Especially if you are on a Mac your display resolution might have a higher resolution than the default canvas in OBS. Left click the preview -> right click the preview -> transform -> fit to screen, or Ctrl+F after left clicking.

10. Heading Straight towards the Goal   strategy 🔗

Here is a general strategy that can be applied to any problem:

  1. Clarify what the goal is.
  2. Try to get to the goal in the most direct path possible for some time.
  3. Take a step back and reflect.
    1. Are you confused? How can you get not confused (new subgoal).
    2. Is there a better way to do this?
  4. Goto 2

Somehow doing this is very unnatural for the brain. It's easy to get lost in the details of writing code, forgetting about why you are writing the code. Similarly it's easy to think forever about how to do something in the abstract.

Failure mode 1: You have an idea, and immediately try to implement it in code, and only realize after many hours that it doesn't work. It would have been faster to clarify what the goal of the code is initially, and to regularly take a step back and reflect on if the code is going in the right direction.

Failure mode 2: You don't know exactly how to approach a problem so you think very long about how to do so. (Just trying and then reflecting would be much faster.)

11. Blindfold Yourself: learn to solve problems by solving them without looking up their solutions 🔗

A general failure mode people run into: "I need to first read all of LessWrong before I can start to think about alignment."

The goal is to learn the process of getting a result. We don't care that much about the result. Consider:

  • By copying from stackoverflow you get lots of code that does what you want, but you don't learn the skill of going from a problem to an algorithm that solves the problem. By looking at Stackoverflow answers, you get working code for solved problems, but don't learn how to get code for unsolved problems.
  • Instead of getting the result. If you want to learn how to fish, don't buy a lot of fish. By buying fish you get lots of fish but you don't learn how to fish.
  • Reading Hold of on Proposing Solutions gives you a useful strategy for doing research. But it does not train you in coming up with similarly effective strategies.

That is why we often want to immediately jump into doing research, instead of reading about existing alignment research on LessWrong. This concept also generalizes to learning technical skills. Here are some examples:

  • Solving Sodoku or Minesweeper, without looking up any of the known algorithms for solving it. If we now where to try to solve a variant of Sodoku that dosn't have an algorithm you can look up, you'll have much easier time solving it. E.g. I might notice that:
    • I can first simplify the problem, trying to solve sodoku on a tiny 6x6 board.
    • there is a general strategy where I attempt to combine the solution for each 6x6 board of a 9x9 board.
    • exponential search is often intractable.
    • I can describe the board in first order logic, and then proof that certani board states are impossible, and that this can prune the search space.
    • I can write a program that computes statistics about randomly generated sodoku boards. Looking at these statistics can help me find patterns.
    • I can write a program that checks whether a rule I discovered is infact holding for all boards, by verifying that it holds for many randomly generated boards.
  • To train to design efficient algorithms you attempt to find a procedure that can find the shortest path between two nodes in a graph. You might re-discover Dijkstra's shortest path algorithm, but that's fine. We don't look up Dijkstra's shortest path algorithm, because that would not train the skill of coming up with algorithms.

When trying to re-invent something already known, we have the advantage of:

  • Being able to get hint when we are really stuck.
  • Compare your final solution to existing solutions. Once you notice that they are better, stop and try to improve your solution.
  • Look for solutions that also walk through the persons resanoing process for how they arrived at this solution.

12. Reflection as a General Force Amplifier 🔗

Reflection is the single most important skill. It helps you get better at everything else.

Reflection is about analysing how you have been going about things, with the goal of improving how you go about things.

Example: Learning Algorithms by Implementing them

I want to learn how Dijkstras algorithm works, and watch a youtube video about it. I think I understand exactly how it works. Some weeks later I want to implement it but get stuck, and need to watch the youtube video again while implementing it.

Later I learn about quicksort, and casually create a toy implementation of it for fun. Later I actually need to implement quicksort in a real project. But it's very easy to do now, because creating a toy implementation forced me to understand deeply how the algorithm works.

When reflecting I notice that probably implementing an algorithm makes me understand it much better. Quicksort is simpler than Dijkstra, which is why it was more natural to implement it. But perhaps if had implemented Dijkstra, even though the first step would have taken longer, I would have immediately build a good understanding that I wouldn't forget. Overall this might save me time.

The conclusion of the reflection: Next time I learn about an important algorithm I want to immediately implement it, to verify the hypothesis, that this makes me understand the algorithm so well that I don't need to go back when I need it in a real project.

When reflecting you want to mostly first work on something concrete, and then reflect on the concrete thing you have been doing. Mostly you don't want to abstractly reason about what the best way for doing something is.

Other things you might notice while reflecting:

  • A particular strategy worked well.
  • Notice that you didn't do something that you I wanted to do.

12.1. Creating a Model and generating Solutions with it 🔗

So far I only described noticing things. Another important part of reflection is to:

  1. Make a model of important problems you noticed.
  2. Using your model to generate a solution.
  3. Implementing the solution.

If you notice that something works well you still need to design and implement a strategy that will make you reliably do this good thing.

Example: Modeling why I don't like Math

When reflecting you might notice that you think that math is very useful, but that somehow you feel aversive towards studying it. Immediately trying to generate a solution might result in something like "Ok, I just force myself to do math. Just do it!". It my experience this doesn't work at all. Each time I force myself I build up a little bit more aversion making it harder and harder to start studying.

So hold of on proposing solutions. Instead build a model about why you don't like studying math. I think in my case school gave me a lot of negative reinforcement. Perhaps I can frame the study of mathematics in a way that my brain doesn't associate with school. E.g. I enjoy programming, so I could learn about basic linear algebra by implementing a rasterizing renderer. Afterwards I could use lean to go through linear algebra done right like other people have done.

Perhaps the way university presented linear algebra was too theoretical. I could watch stephen boyd's or John's lectures which give many motivating examples of how linear algebra is useful, instead of only defining and proving thing about vector spaces in the abstract.

Maybe because my brother is very good at math, my brain isn't that motivated to learn about math, because it's not easy to become the best at math my social circle. Simply realizing that this might be the case, and noticing how incredibly idiotic this would be, probably makes this factor less into my behavior.

While when reasoning analytically about it, it seems clear that math is useful, my brain stem might not be convinced. How could I convince it? If I could get a lot of concrete evidence that math is good, this might convince my brain stem. To do this I could watch out for where problems come up in my normal work, that can be effectively tackeled with linear algebra. It's probably a lot easier to motivate myself to learn linear algebra concrepts in the immediate service of solving a problem I am having. If I manage to solve, and reflect on how I managed to do so I might notice something of the form "Wow, without linear algebra I wouldn't even know how to start thinking about the problem, let alone solve it." This might be evidence strong enough to convince my brain stem.

12.2. Implementing Solutions 🔗

It's all to easy to generate a solution, and then never implement it. Knowing that stephen boyd's and John's lectures are good doesn't make me watch them by default. Setting up trigger action plans is one of the best ways to go about it.

For example, each morning I want to take my supplements, meditate, and prepare food for the evening, before doing anything else. By default I just don't do any of these. So what I can do is setup a daily alarm that reminds me to do all of these things. This is the trigger. I then take a large stickynote and write on it all the things that I want to do in the morning. I put it somewhere visible from anywhere in my room.

Similarly when discussing research with somebody I might set an alarm for 30m before the end of the session, to rember to reflect on how the session went and how we can do better.

In general this is a hard problem, and setting up repeating alarms as the triggers is the only thing that I have found to reliably work.

12.3. Doing Reflection is Hard 🔗

The hardest part about reflection is to actually do it. You need to schedule a specific period of time dedicated to doing reflection. This is harder than it sounds. I have been doing reflection a lot, and >95% of the time I'm glad that I did reflect afterwards. But ~75% of the time my brain seems to expect the reflection to be completely useless, and I never feel like doing it. Instead my brain whant's to continue on whatever task I am working on currently.

If you are doing less than 30 minutes of reflection during a day I am highly sceptical that this can be optimal. Sometimes I spend half a day reflecting and it doesn't seem too much in retrospect.

13. Definition: Interactable   definition 🔗

An interactable is a pice of executable code that takes in user input, and reacts to the user input with low latency.

Examples of interactables:

Non-examples:

  • Creating a static plot of weight VS height of a population (no user input)
  • Running an evolutionary simulation like primer (no user input)
  • Writing code for a C project that needs to compile >1 minute for every code change (long lag until changes from the user input become visible)

14. Desig Game Analyse your Algorithms 🔗

If you can solve a game quickly, but you don't know how to write an algorithm that solves it quickly, then you can learn. By analysing your own reasoning process and distilling it utlimately into computer executable code, you will have learned how to write a new kind of algorithm.

When making a game we can steer the design such that you can play the game, but a brute force search would be intractable.

One way to do this is to increase the search space, but make the problem generally easier.

E.g. consider that we have a game where you need to match up

15. Evaluating the Approach 🔗

How can I be most useful to people in making them better at solving hard problems? I don't know exactly. I am trying various things. It's important to evaluate what actually works.

[2025-01-19 So] Robert said that the examples in Motivation: The Power of Explorable Interactables where useful. Also he found the section about reflection useful. The examples there also helped. He likes that when worknig on the project doing reflection is actually a thing that you are expected to actively do, instead of simply learning about it in the abstract.

16. Romans Interview: Exploring the space of executable Programs 🔗

When interviewing Roman I did something completely different than described in AISC 2025 Interview Instructions. It was an interesting exercise so I documented it here.

  • 00:00:00 Explaining the task
  • 00:01:57 Choosing Sets - Roman chooses to explore the set datastructure. He does so by writing code using sets and evaluates it. He notices that python sets can't be nested.
  • 00:02:59 Implementing sets - Roman implements sets that are nestable.
  • 00:13:20 Switching to exploring somithng new - Johannes is pushing roman to think about non-standard computations on sets.
  • 00:22:53 Counting unique elements in a nested set - A computation Johannes never thought of before.
  • 00:26:07 Cyclic Datastructure problems - We run into a bunch of trouble with having a set that is a member of itself. How to solve problems like iterations when you have cyclic datastructures seems interesting.

Conclusion: There are a bunch of interesting considerations here like how to represent, compare, reason about, implement, and manipulate infinite datastructes with regular patterns. It feels like there are many questions here and this could be explored further. This is not something that I thought much about before, and all of this arose during the exercise. This is strong evidence that you can discover new interesting ideas with this exercise.

17. Game Code 🔗

This section serves as archive for the game codes.

17.1. Negar's Cylinder Game 🔗

[2025-01-26 So]

import random
# n = int(input())
# a = list(map(int, input().split()))

print("""
= The game of Cylinders

== What the game is? 
In this game, we have basically $n$ cylinder and in ith cylinder $a_i$ stones.

=== Goal of the Game:
The goal of the game is to empty all the cylinders.
1. Easy: you should just achieve the game's aim.
2. Medium: you have to finish the game in the given number of steps.
3. Hard: you have to finish the game with the minimum required steps. 

=== Moves: 
In order to achieve the goal we have some moves:
- you can take two stones from a cylinder and add one stone to another cylinder. 
- you can add three stones to a cylinder 
- you can choose two cylinders and take a stone from each of them. 

_! Attention: we can't have a negative number of stones in a cylinder.! _
""")

n = random.randint(3, 5) 
a = [random.randint(0, 5) for i in range(n)]

sum = 0
for x in a:
  sum += x

def print_invalid_input():
    print("""
!!!!!!!!!!!!!!!!!!!
!!!INVALID INPUT!!!
!!!!!!!!!!!!!!!!!!!
""")
    
choose_cylinder_msg = "Please enter the indicies of the cylinders to operate on in order (use zero based indexing): "

# Johannes Modifications
# - Add win message.
# - Add try catch to avoid abnormal abortion when player enters invalid index.
# - Add game explanation (copy your documents text here and print it.)
# - Minor adjustments of other messages to player.

while(sum != 0):
    try:
        print("number of stones per cylinder: ", a)
        typ = input("""
        Select an action with a number:
        1. you can take two stones from a cylinder and add one stone to another cylinder. 
        2. you can add three stones to a cylinder
        3. you can choose two cylinders and take a stone from each of them. 
        """)
        if typ == '1':
            print(choose_cylinder_msg)
            cyl1, cyl2 = map(int, input().split())
            if(a[cyl1] < 2):
                print_invalid_input()
                continue
            a[cyl1] -= 2
            a[cyl2] += 1
            sum -= 1
        elif typ == '2':
            cyl1 = int(input(choose_cylinder_msg))
            a[cyl1] += 3
            sum += 3
        elif typ == '3':
            print(choose_cylinder_msg)
            cyl1, cyl2 = map(int, input().split())
            if(a[cyl1] < 1):
                print_invalid_input()
                continue
            if(a[cyl2] < 1):
                print_invalid_input()
                continue
            a[cyl1] -= 1
            a[cyl2] -= 1
            sum -= 2
        else:
            print_invalid_input()
            continue
    except:
      print_invalid_input()
      
print("YOU WIN. YAAAAAAAAAYYY!")