Test Bench

In my last post, I mentioned the vital need for a large language model test bench. Essentially, the program I have in mind consists of a few different features:

  1. Ability to choose the model you’re connecting to (without necessitating that you run it out of the application or on-device).
  2. Ability to attach a sentence embedding framework or model to be run on-device – probably by calling out to python?
  3. Ability to store conversations with various models that preserve things like model name, parameters used, etc. for later retrieval.
  4. Ability to develop prompt templates
    • Include testing of templates – spreading tests out amongst different models, using different parameters, and storing all of these details for later analysis
  5. Ability to develop workflows where the products of templates feed into other templates.
  6. Ability to generate on-the-fly A-B testing scenarios to compare the outcomes of various schemes.

OK, now for some explanation here: pretty early in 2023, chain-of-thought libraries started cropping up to take advantage of a lot of the schemes I’m describing above – static chains of queries that encouraged the model to branch its own behavior over multiple actions to extend and diversify what they were capable of doing. This led to some interesting possibilities, such as the practice of building a faux ‘team’ of roles that you could have the model roleplay as in order to solve different aspects of a problem and collaborate with itself to develop a more-robust solution than may have been possible with straight querying.

It’s becoming obvious that more-advanced querying – developing meta-queries and second-order (and possibly third-order, whatever that would mean) queries – would benefit everyone in finding more-advanced use-cases for LLMs in the wild. It’s difficult to even constrain the realm of possibilities with these technologies given how broadly they can be applied, but finding where that edge is (and finding spaces that perhaps have not been explored yet) requires a test bench of this kind to be able to crank through example cases, store back the results, send them through human evaluation, and then store and display statistics on what works and what doesn’t.

This is probably going to be a larger project, but it’s a necessary precursor to any larger LLM project, whether that be in gaming or education or any of the other scenarios I have humming in the back of my head. I’d like to explain the education one further in a later post.

New Media

On my first failed foray into the world of post-Bachelor’s academia, one of the central themes in the education department was the concept of ‘new media’. This would have taken place during the initial thrust of the belief that iPads for every student would accelerate and propel education into a new millennium; grappling with this concept was a new paradigm in attempting to address inherent differences and permutations of students’ pedagogical needs. Most of the idea surrounded migrating the base assumptions of literacy into literacies of varying types given the shifting and dynamic nature of new technologies – along with recognizing that the cultural/memetic landscape was moving and evolving faster and creating more niches for self expression and actualization, and that all of these had to be taken into account in modern classrooms.

There were inherent contradictions in the methods teachers were forced into implementing by precedent and law, but there were good points being made about the nature of the shifting landscape of media and interaction in my classes. Video games are a great example of this: the medium being interactive means that the negotiation of meaning and literacy becomes a two way road where authorship and knowledge are collaborative concepts.

This collaboration becomes all the more relevant with the development and adoption of large language models. There have been a few instances of games being developed that utilize this newborn technology, but they have been closer to test benches with a fancy façade wacked on top rather than serious attempts to weave meaningful and complex experiences from this technology.

A thought has been bouncing around my brain: interactive fiction has everything to gain from this revolution. One of the biggest advantages of these large language models is their power when structure is applied that guides their voice. This structure – something every game designer and programmer and story writer is familiar with – could provide the possibility for incredibly dynamic depth, just by writing the edges of a given game world and shaping the direction of its products to point it at really interesting targets, while keeping things fuzzy enough to allow for truly unique stories and experiences for each playthrough.

I started looking into some interesting systems that could be dropped on top of a large-language-model-core that could provide rich experiences. Here are a few ideas:

Psychological Anthropomorphization

    Inspired by Disco Elysium, this system essentially takes a modified version of the Myers-Briggs/Jungian Personality Dynamics and transforms the different cognitive functions into anthropomorphized characters that pipe up throughout your journey to advise and aid or ail you.

    Politics/Management Simulation

    After doing light reading on organizational dynamics, I was interested in tinkering with ways to develop worlds modeled after different historical semi-stable government structures: monarchy, constitutional monarchy, feudal societies, etc. – along with the cultural values accompanying each. What would be fascinating would be to have a set of generation steps develop a new world from the outputs of a large language model. The idea behind this portion of the system would be to spend time generating at least a set of characters along with their inter-relatedness in organizational structures to provide a basis for interesting storylines to develop.

    More ideas are coming, but there’s an absolutely vital project all of this development depends on: a GUI-based prompt-generation and testing program that would save prompts that would have dynamically-fillable portions to consistently be able to query these models for information or decisions. Such a program would essentially save these prompts, have the potential to develop massive tests of on them to see their success and viability with different underlying parameters and in a variety of circumstances, and then potentially develop chains of these pre-arranged prompts to keep the world creation and world simulation humming along.

    Have yet to develop this though – it’s on the list.

    Back Again

    For those of us that sport rich inner worlds, it’s often difficult to remember that, on occasion, it’s useful to form the habit of pulling the ideas and thoughts and musings out of the mental menagerie to see the light of day and live a little in the sun. I want to get back in the habit of doing this – both for my own sanity, to chronicle my thoughts for later reflection, and to force myself to verbalize the ideas hammering around inside in a constant maelstrom.

    To this end, I’m probably going to be converting this space into a place to vent. Not because I have a lot of angst to offgas but because I have a lot of ideas competing for my attention and motivation in my head and they do change a lot. Like many people with a similar personality to me, the trail of projects is long and reminiscent of a highway of misfit toys – incomplete, ill-formed, and abandoned (until they’re not).

    My first instinct is to make an outline of all of the ideas I could possibly talk about, but a list is a device that represents an inner bureaucrat that I have a distinct aversion to, and so I’m going to keep this more off-the-cuff.

    So, the first topic I need to vent about are… ternary machine learning systems! Or, the misshapen idea I have in my head that probably doesn’t work, but I haven’t had the patience to complete the system yet. So, instead of writing the code and debugging it and getting it to work nicely, I’m going to write about what it is here, how it works, and how I want it to work in the future. And also the crippling problems the system has that would probably require that I create new kinds of math or contend with literal impossibilities in order to overcome its weaknesses.

    So, ternary models: those following AI/machine learning/large language models closely will remember Microsoft releasing the ‘Era of 1-bit LLMs’ arxiv article. The article outlines schemes for a new quantization method that converts floating point values to a ternary-based system – i.e., three values only (-1, 0, and 1). These are technically referred to as 1.58-bit models since log2(3) = ~1.5850 – because for an arbitrarily large amount of ternary values, they can be packed at a size of about 1.58 bits per value.

    This may not sound like much or may not be intuitively a ‘better’ thing on its face if you don’t know a whole lot about the kinds of calculation that go into large language model inference, but suffice it to say that once you constrain the values to these three, it’s possibly to do away with large portions of the extremely performance-heavy matrix multiplications required and instead replace them with matrix additions with some mathematical cleverness.

    My idea was to take this a step further. I realized that if you’re constraining the values this much, the calculations would represent an awful lot of repetition – and could probably be cached and stored in some way so that instead of even having to do matrix addition, you could just do lookups in a hash table. O(n) complexity essentially I think? My complexity calculation math is rusty. It might even be faster than that.

    So how does that work? Well, inference calculations for weights in the feed forward network are usually just a rote multiplication (which, for these values, either means doing nothing for 1, zeroing everything out for 0, or negating everything for -1), summing all the weights, and then performing a ReLU function or, in the case of Mistral models, SwiGLU function (which apparently combines a sigmoid function and a gated linear unit algorithm – the success of which was apparently attributed to ‘divine benevolence’ in lieu of a solid explanation). This last portion is basically to calculate the degree to which a given set of weights connecting a previous layer activate a particular neuron in the next layer.

    If you have a set number of values that these weights could possibly be (-1, 0, 1) you can potentially pre-calculate all of that beforehand, as I mentioned. The scheme I had in mind was to essentially pack 5 ternary values into a single object, which, if you do the quick math here, 35 = 243 – meaning you can encode the entire set of grouped ternary values into a byte value, or an unsigned char value in C. Basically, the encoding is between 0 and 255 with some extra empty encodings at the end. At that point, every single permutation of 5 ternary values can be represented in a single byte and adjustments to those values are just translations from one encoded value to another – something very easily mappable.

    If you take these concepts and try to translate them from fast inference (easy-peasy) into fast training, the problem becomes orders of magnitude more difficult. For reference, the backpropagation process for achieving gradient descent involves performing multivariate linear analysis on the entire set of previous values (and the functions for producing said values) at each step of the whole process. These sorts of calculations are easy to wrap your head around when the values represent continuous vectors, but… things get weird (for me, at least) when talking about the same kinds of calculations for quantized values. I could see a way for these calculations to also be heavily simplified and even pre-calculated, but… that’s not something I’ve researched enough to know. It could be feasible.

    If it is feasible, I can imagine a system that is capable of being run in training AND inference mode in real-time on consumer hardware with relative ease. The parameter count would probably have to be much higher, but since these parameters are much tinier and the computations are simply faster, that shouldn’t matter too much.

    I have yet to finish building a working prototype for this though. I want to, but it’s… a lot for me to wrap my head around. Just learning the calculus involved in the backpropagation process was a lot given my… rough background in calculus. Still, this is a project I do want to devote some time too since real-time training and inference are a worthwhile goal.

    I think I’ll leave this topic here for now, as there are several others I would like to work on for future posts.

    An Odd Day

    Today was strange. Last night I went to bed at a reasonable hour and my body decided that it was time to unreason. I woke up after half an hour and then couldn’t get to sleep again until 1am.

    On the plus side, I got a pretty good night’s sleep. Wake up time: around 7:30am? Breakfast: oats and yogurt and frozen blueberries. Leftover casserole stuff for lunch with yogurt and pickled onions. (Pickled onions are severely underrated.)

    On the downside, I basically got nothing done that I wanted to get done today. Training has been insane. I’m doing well and learning the material, but it’s seriously time consuming. And it’s frankly boring.

    My project isn’t making much progress. I’m still trying to wrap my head around the cellular automata algorithm. I’m not sure how each cell in the entire field should be updated discretely without some cells getting double attention (i.e., paying attention to themselves as well as all their neighbors). I’m not sure what the solution is, but I’d like to find a way to do it so that the calls are made in batches and can be parsed out to different threads for parallel processing. That would be ideal.

    I’m blurry, but not as sleepy as I’ve been the past few days. I was literally passing out in my chair last night (which makes my body’s reluctance to sleep all the stranger). Who knows what’s going on.

    I want to try to work out tomorrow morning before work. Small goals.

    Dead

    Today, I am dead tired. I got more sleep last night than I did the night before, but not enough.

    Wake up: 4:55am

    Breakfast: beef, spinach, peppers, and onions with egg casserole. Yogurt, frozen berries, and around a half cup of oats with whole milk later on.

    I got a few things done, but I’ve been nodding off all day. Training day at work. Nothing too exciting.

    Will write more tomorrow. Today was rough. No workout, no doggie walkies. Definitely have to go to bed earlier tonight.

    A Day to Begin Habits

    I cringe at the title of this post, but I think that, on some subconscious level, I wanted to phrase it that way for a few specific reasons: one, I need to become more comfortable with maintaining habits. Two, the fact that it is uncomfortable is kind of the crux of the problem.

    My written journal today reveals some interesting things. I’ll preface what I wrote by saying that I didn’t get to bed until late last night – but whether I make a habit of that I will leave up in the air. I kind of like feeling tired at the end of the day, and perhaps it’ll take staying up late each night and getting up early each morning to maintain that. Maintenance is the name of the game now. But let me explain why.

    This morning’s journal entry:

    Wake up: 5:31am

    Pre-work: AG1, make coffee, change shirt, grab notebooks.

    Morning snow.

    Ate leftover brown rice cooked in pork juices w/baked beef with peppers and onions – around 8:15.

    To do:

    • life weights ☑
      • Dumbbell rows, 50 lbs., 6x? 7x? 5 reps ea.
    • clean something ☑
    • box up bread maker ☑
    • hook up printer

    Commentary on Parannoul: “How profoundly underwhelming.”

    And then there are project notes.

    I got a lot done today! The problem is going to be maintaining this level of productivity when I don’t have motivation. I am motivated now. I have to take advantage. But I know that that motivation is not going to last.

    I made some small notes in my project and added precisely one line. I also did dishes, did some laundry, and got my breadmaker boxed up. And sorted mail. And brought various toiletries and my scale upstairs. All on top of working for 9 hours today. It was a good day. And it was easy today. On future days, it will not be easy.

    Some notes on how I felt today: I seem to have been nodding off at various points in the day, and yet I managed to do a workout and walk Charlie without too much issue. I want to make note of that because I want to see whether that changes if I start losing more weight.

    Above all, I want to keep up the chronicle – even if it’s to log my despair that I was unproductive. ???? Perhaps on those days I will have thoughts about something else.

    Oh yeah, I have a blog

    I’m peeking into this dusty back room that I used so many years ago and realizing that there are several drafts of thoughts unfinished that never saw the light of Internet dawn; so it goes.

    I’ve decided that I want to start daily writing down some thoughts, if for no other reason than to have some record to look back on in years to come. It’s good to reflect, to be cognizant of occupying a moment in time, and to remember the progression of things. It gives weight to each moment – a weight I need to remind myself of.

    I’ve been thinking about the idea of the perfect day and what it should consist of. I have a budget of 24 hours:

    • Each week day, I tend to work for 8-9 hours (sometimes more). Let’s just say that that brings my total down to 15 hours.
    • Each day, I try to spend at least 8 hours sleeping, bringing my total down to 7 hours.
    • I typically spend about 1.25 hours talking with my lady love. That brings my daily grand total down to 5.75 hours.
    • I spend 30-45 minutes each day walking the pooch. That brings my budget down to 5 hours.
    • Let’s just get it over with and say that before bed and after waking up are about 30 minutes of wind up and wind-down each. That leaves me with 4 hours of budget time to allot each day to other activities.

    Four hours. That’s a lot more than I expected! And it also means I waste a lot of time each day. What could I fill those hours with? Here are some things I’d like:

    • Working out (~45 mins./day)
    • Project work (at least 1.5 hours/day)
    • This journal (15-30 minutes each day)
    • Down time (probably the rest)

    Time to start tracking things to see how I actually spend my time. This is good think about. I want to continue this thought process tomorrow.

    20190610 Chronicle

    Buffer object rewrite: done. Text formatting and links: done. Now to iron out the details…

    Next up on the major agenda is establishing a tree folder structure that’s navigable via the “cd” command and viewable using “ls” (or “dir” if people want to use MS-DOS commands – I guess I could set up both with aliasing). This could be interesting.

    After that’s set up, I think it would be appropriate to set up state capture/saving via LocalForage or similar. Back to the code!

    20140501 Buffer Plans

    Embarrassingly, I’ve been stuck thinking about a pretty simple problem involving encapsulating the buffer data in such a way that I can format individual sections of it. I’m leaning towards packaging the buffer segments in one form of data initially when the window dimensions are known:

    {
     "text":  [text of some uniform format],
     "style": [some standard style - probably for amending ctx.font],
     "type":   [plaintext or hyperlink], 
     "action": [further defined if "type" is "hyperlink" - performs a 
               command once the hyperlink is clicked.]
    }

    … and then simply organizing this data into lines in a buffer printing object. The buffer printing object would be largely identical, except that a) the objects follow wordwrapping rules according to the size of the window, so the text is trimmed; b) the buffer printing object could be caching the computed data but must be updated whenever the window’s size changes; c) would have smaller helper functions that add to the buffer printing object that would add individual lines to the raw buffer object and the buffer printing object. This second object and how it would work has been where I’ve been stuck, although it’s a pretty simple set of problems once you think about it. It’s just breaking those problems down that’s been the problem. Maybe I just need to write it out. Maybe that’s what I’m doing now!

    I shall think about this more later tonight.

    20190418 Day Plans

    I’ve finished cleaning up some of the keyboard event handlers on the portfolio front page by switching in-tag event handling to pure JavaScript handlers – much cleaner. The visuals work better this way, as the mousedown presses the key, but only mouseup on the key will actually activate the functionality (and mouseout will reset the visuals without activating the key, which is perfect although… technically unrealistic).

    It’s time to start the real work on the portfolio project of implementing client file structure state tracking and navigation, folder navigation, and possibly implementing hyperlinks (which has the built-in complication of requiring character-by-character formatting implementation – super fun!).

    I have my work cut out for me. *cracks knuckles*

    20190416 Beginning the End

    I started this blog as a means by which to write down my thoughts on programming, talk about the projects I was working on, and basically stream-of-consciousness on some things I’m trying to work out. Crucial to repeating the structure of my previous blog habits will be to have a set time in which to write posts every day. That seemed to have been the pattern I relied on when I started my first blog (although novelty probably was a factor as well).

    Anyway; it’s time to get down to business and work out exactly what I want to accomplish over the next 3-4 months.

    • Portfolio Work/Projects
      • BenjaminMarquardt.com
        • Mock directory functionality
        • Minor file access
        • Hyperlinks?
        • Command history
        • Code cleanup + comments
      • Jungle
        • Bugfixes
        • Code cleanup + comments
    • JavaScript Mastery Work
      • Work up list of crucial language concepts
      • Read up on new language developments
    • Frameworks
      • VueJS
      • AngularJS? ReactJS? (probably the former, since 3/3 major frontend frameworks would be too much to concentrate on)
      • NodeJS

    Per the lady’s suggestion, I’ll be working on what I can each morning (and probably a bit during the day at work if I can help it). Let’s see what I can cross off of the above list over the next week. Until tomorrow…

    20180709 Next Steps for the Project

    The camera problem has been bugging me, so I’m going to attack it. I figure that the engine should collect the buckets that the camera can see, render those to the texture, and skip checking the camera bounds/refreshing the bucket list (lol) if the camera hasn’t moved. This could lead to an interesting implementation where there are multiple windows rendering multiple parts of the world (security cameras?). Something to think about, at least.

    Setting this part of the program up will help develop some things: adding and removing buckets and their contents from the render pool; making the render pool a dynamic array instead of a horrific linked list (allowing subtraction); checking for camera motion; checking for updates to the buckets themselves. By the looks of it, I’ll have to add the ‘hot’ attribute to buckets to know whether I’ll need to update the render pool to reflect the buckets’ contents. The entities within will be referred to by their pointers, so the values could change without hurting anything; when entities shift between buckets, though, the bucket entries would need to be updated. How would we get around the issue of updating the render pool for all buckets when one bucket changes? Hmm. Something to think about.

    20180705 Thoughts on my Engine

    I’ve been doing a sort of bird’s eye view of the code I’ve written for my 2D engine project using SDL2. So far, a lot of ‘test’ material is still in place, so I’ve been sort of scraping at the edges and preparing to flesh out the major portions that will eventually blossom into a more solid backbone for the engine.

    Currently, rendering and buffer swapping works, but it’s directly referencing the entirety of my spatial map code to get ALL entities rather than referencing the camera object to see what entities it should portray within the displayed area of the world. I did just create the camera object, but I’m having some difficulty conceptualizing where it should live – the graphics portion of the engine? The scene portion within the graphics portion? Hmm. Tough to say.

    I haven’t even begun implementing entity AI or anything of that sort yet; I’d like to get the camera and the world working before that point. I’d also like to build in restrictions for camera motion as soon as things move beyond a certain limit outside of empty buckets in the spatial map; i.e., stop the camera motion towards areas that are just infinitely empty.

    I was tempted to attempt a list of features I’d like to include, but that’s way, way premature. Instead, I’ll focus on chipping away at the project one obstacle at a time.

    20180613 Chronicle

    The weather is cloudy and a bit drizzly, but still warm with a cool breeze. Walking out on the grounds is not unpleasant, and the diffuse light gives ample opportunity for very pretty flower photographs.

    On my mind today: GMS2 and its potential for my plans to create the ultimate simulation… if only I could negotiate with it to play nice. We shall see.

    I did a pretty wimpy workout this morning, but I still did one. I really, really need to pick up more eggs when I go down to the valley tomorrow. Absolute necessity. They make for easy, fast, protein-laden breakfasts that really start my day off well. I might just get two crates…

    20180611 Chronicle

    Sunshine and breezes! It’s a lovely day today – I’m going to have to make a point of breaking my camera out.

    I had a mixed weekend. Dishes were done, but I didn’t do any shopping or mowing. I’ll have to mow tonight and will absolutely need to do a workout tomorrow morning.

    20180604 Chronicle

    Rain yesterday, rain today. It’s cool and pleasant, but also a bit humid. I’m suspicious that the impending resurgence of the mosquito hordes is right around the corner.

    Commencement parties happened yesterday, so the Seminary staff are given some leave today as ‘no one has any work to do’. I’m still going to go in after lunch though, as there are people I’m meeting with (and there are a few projects I absolutely need to work on).

    Anyway, my goals for this morning: a) pick things up and put things down to exhaustion. b) Flesh out a post about the aesthetic and practical value of the specifics of my game (engine?) idea. c) Maybe clean some dishes or sort some laundry (or both)?

    Thought of the day: “It is not good for the man to be alone.”

    20180601 Procrastination and Maps

    I know I’m supposed to be starting a workout, but I wanted to jot down some thoughts really quick. I only recently breezed across an article covering Google’s release of its Maps API for development, including functional calls that could be used to develop AR apps similar to Pokemon Go. I have yet to take a deep look at the spec to brainstorm what could be possible (and they seemed to waste a lot of time explaining that they could use their maps api for city fast building shape and placement for in game cities, but that was sort of a red herring for the really cool stuff imo), but… overall it sounds promising.

    I should pick things up and put things down. Enough procrastination. Perhaps more thoughts later.

    20180601 Chronicle

    It’s the first day of June. I kept my bedroom closed to prevent cats from waking me up in the middle of the night with impending beard rubs, and ended up getting woken up at around quarter after 3 in the morning to scratching and fretting at the door. And, predictably, I couldn’t go back to sleep afterwards. Lovely. Today is going to be fun. On the positive side, I can leave early due to my extensive work requirements this weekend.

    It’s overcast but warm and humid. It feels like a jungle. I’m guzzling my second cup of coffee post-breakfast (six softly scrambled eggs), and thinking about how ineffective today’s workout is going to be because of the fatigue backscatter of lost sleep that plagues my consciousness. I’m stalling by setting up my personal laptop (recently optimized after eliminating Avira, the hdd hog) and convincing myself that writing this post is a good excuse not to lift heavy things right away. However, the clock has passed the 7:00am and even the nice keys and convenience of a speedier laptop shouldn’t tempt me away from ripping up my muscles a bit. Finishing my coffee first would probably be prudent though…

    20180531 – Chronicle

    It’s the last day in May and I’m cultivating my sense of dismay that time continues to pass too swiftly. I have so much to do and I feel like I have no time. And yet I have so little aversion to wasting it.

    This morning’s routine: wake up, eat a nice large breakfast, put on the iLeague Starseries group stage tournament (this morning: NRG v. Hellraisers – NRG wins 2-0) and do all the dishes from the past week, including the dishes for the two racks of ribs and the failed gravy (and guest visits).

    The sky is overcast and it’s cool and breezy and pleasant with occasional winks from the sun. I took the recycling can out today, forgetting that Memorial Day would mean that the trash people won’t pick it up until tomorrow. My weather app wasn’t updating properly this morning though, so I couldn’t check to see if rain would mean soggy cardboard to greet the recycling truck when they come tomorrow morning. Time will have to tell, and perhaps I’ll have to drag the can to the porch in the meantime.

    I still ache from yesterday’s workout. ‘Twas a good one. I think my resting heart rate is lowering, which is great. I need to grind more and work through this and work out more consistently. I think that after 3 weeks of doing MWF upper body, I’ll start doing Tue-Thu-Sat leg days. Big muscle groups are important, and I never concentrated on them much. It’d be good to keep all the muscles in rotation. It just means that all my chores will have to be shoved to the end of the day when I get home. So it goes.

    Later: more interactive development thoughts. I really need to start fleshing out specifics on an engine I should begin to work on, and what the engine’s requirements will be for testing purposes.

    20180530-02 Thoughts

    The difficult conglomeration of ideas I keep bumping my head into run thusly:

    • Good interactive media emulates the pattern of ‘massive simulated systems’ interacting with other ‘massive simulated systems’ manipulated by players to produce effects on the colliding edges of the simulations that produce unique stories the players can appreciate and manipulate – with the idea that the situations created would be unique and emergent enough to transcend the purposes of the design itself. There are a few examples of this idea being implemented in separate contexts:

      • SimCity in a general way. It uses economic forces and incentives to simulate population density, growth, decay, etc. based on economic environmental factors such as taxation, prevalence of viable employment opportunities, abundance of local amenities (healthcare, education, law enforcement), and the attraction of tailored gardens. You can create a poverty stricken, crime-ridden, pollution-heavy suburb and then wreck it with tornadoes and earthquakes and aliens. Or you can try to balance all the spinning plates and grow the population as high and as happy as you can.
      • Dwarf Fortress, obviously, but this isn’t as well-represented because the majority of the simulation happens in the generation without player interaction and it almost feels as if the world is only directing itself in action towards the player rather than with itself (so the world feels a bit static until you touch it). Maybe I have that wrong and the clocks tick all over the world while you play, but that seemed to be my impression.
      • Many triple-A games attempt this with generic physics simulations – i.e., allowing the players to perform strange feats simply through the imperfections and quirks in their systems (see: bunnyhopping in CS:GO or the speed boost hacks in Ocarina of Time). Minecraft has a lot of these too, allowing players to make computers or automatic melon farms.
      • A lot of Paradox Interactive games play with war and politics on an extremely macro scale in this way, but it’s turn-based, deliberate, and, to me, a bit stale-feeling. I want to interact in a way that is real-time, skill- rather than strategy-based, and specific rather than representative and general.
      • Prison Architect has a lot of interesting simulated dynamics with the prisoners and the general prison ‘state’ – i.e., high turmoil, lockdown mode, etc., and the emotional states of the prisoners govern a lot of how their behaviors play out.
    • The contexts in which these methods are used are preposterously limited (i.e., extremely generic economics in the case of SimCity and its clones, widely representative politics and economics in Paradox games, and universally implemented physics engines that all have similar annoying and immersion-breaking quirks and failings). There needs to be more variety. I want to try to brainstorm some ideas on the types of variety:

      • The Sims had a lot of strengths in what it was obviously reaching for: in-depth representational interpersonal and inter-personality simulation on the specific individual scale. Ultimately, yes, an interactive dollhouse, but also a sort of proving ground for concepts related to the simulation of human personalities and their interactions with one another. Granted, it barely got beyond the point of need-satisfaction and rote like/dislike clashes between Sims (despite all of the added ‘traits’, the simulation remains largely the same – and stale), but the original idea was an interesting first step into the arena of baseline personality traits informing a central character’s decision matrix to create whole individuals that interact with each other and affect each other.
      • I need to study how politics play out in Paradox games in more detail, but, inevitably, it will largely be a product of the combined forces of a few individual leaders in their respective countries (I’m mistakenly cribbing calculation on this idea from my knowledge of Civilization, but Paradox games – Hearts of Iron IV in particular – have far more potential for political complexity what with the larger internal hierarchies in each political domain (demesne?)).
      • Individual, multi-dimensional simulation (that also finds compromises between inconsistencies or contradictions) would be a worthy goal: which dimensions to use, though, and how to establish a dynamic environment for interesting behaviors to play out in? Interactivity in a largely dynamic environment would obviously make small waves that would effect things; am I trying to set up a sort of Westworld situation? (I.e., standard storylines play out, but player interaction can throw them widely off course?)

    More brainstorms later…