I think I fixed the CUDA issue, but I ran into a docker issue due to system resources getting locked up due to a memory leak. I put out an e-mail for someone else to come and take a look at it. But I'm very excited to get that running. I did some tests with just the CPU only, and even without the GPU I can train networks faster than your run-of-the-mill CPU/GPU combo. It helps to have 20 cores over which you can distribute the workload. And with that GPU that can sustain 288 GB/sec bandwidth, I think I'll be good to go, hardware-wise.
I've got a long-running job going trying to push the limits of what this network size can do, but it's so long-running that it's frankly really boring. It's not quite halfway done, and the squared error is a respectable (for the network and data set size) 36, and slowly dropping.
There are a few avenues of optimization here. One is to try other solvers, which is actually kind of intimidating. Another is to finally start dropping checkpoints (probably just write a pickle to disk). I'm aware, as well, of one possible optimization to the generated functions.
For now, I'm seeing if a call graph of a small run reveals any obvious inefficiencies. I used this to some effect on the Pypy version of this code, but eventually I couldn't see how to make things faster. This looks like it'll be a similar kind of thing; lots and lots of the logic in this code lives in compiled code, but I won't know for sure if I don't look. I'll look into setting up a checkpoint system tomorrow.
ETA: Theano is... peculiar. I do see some some opportunities for modest optimization, though (like 5%). I can try them out, sure.
ETA: Okay, that's a bit of an improvement. Not sure if there's any way to tune the generated code.
So, I am a undergraduate student from Brazil, and I have been following this thread for a while. Recently, I have been learning about Machine Learning because this subject has caught my attention a lot. I was part of a Call of duty clan when someone from this clan created a thread that talked about this thread here, so that's how I found you guys. I used play Magic the Gathering a lot when I was a kid, but now I don't even know the new abilities and features Magic might have.
Anyway, I came here today to say that I came up with this idea of using the algorithm you guys have used, to apply in that card game called Hearthstone. Apparently, Hearthstone seems to be simpler than Magic, so the modeling was also very simple. Basically, I used "card name", "mana cost", "type","text","attack","defense".
The biggest problem I have had is that Hearthstone does not have as many cards as Magic has, so my data base is small. In order to solve this problem, I have created cards getting elves names that I have found in websites. Also, I have got "mana cost", "attack", and "defense" from Magic's cards. Doing this procedure, I have got this input that has 1.8MB, and believe me, it was hard to get to this amount.
I know you guys know better about Magic, and this is the same for me, but I would like to ask if you guys have an idea that could help improving my results.
Olá e bem-vindo, Arthur! Sorry, I meant to reply to you sooner but was preoccupied. I'm happy to hear that you've found this work so interesting and that you're having fun with it.
Some recommendations I would make would be...
* Convert all upper case letters to lower case ones (i.e. A -> a), if you have not already. That reduces the size of the vocabulary of symbols.
* Use unary notation for all values. We've found that to be helpful when training the network to understand quantities.
But the biggest problem of all is the amount of input, as you've noted. You can expand the set of cards in the way you've described, and that's not a bad idea, but remember that the network is imitating you imitating Hearthstone using data from Magic. That alters the distributions of stats, obviously. The other problem is that it doesn't give us much in the way of new body text to work on, and body text is where most of the variation in the cards comes from.
However, if you had an algorithm that could generate all of that and generate authentic-looking cards, then we wouldn't need to train a network to do the job.
So are you going to test bigger neural nets or quicker successions of the same size but with more quick changes?
A quick though that crept into my mind, since from what i remember the first layer of the RNN only reads the card and the amount of data on a card is limited, wouldnt there be an optimal size for that layer that could be calculated or experimentally approximated? (maybe i forgot over the last 79pages if it came up somewhere)
If so one could safe a bit of time by using the optimal size only.
What this means is that I get much faster turnaround time when I do experiments. I can try out a change, and get results rapidly. I can figure out what works and what doesn't much more quickly.
And you're quite right. Bigger is not always better. There's a general relationship between size/complexity of a problem and the amount of computational resources you have to throw at it to get a good solution, but the more learnable parameters you have in your system, the more difficult it is to train.
---
Still working out that bug I mentioned last night. The problem isn't with Torch or CUDA or anything like that, it's with the virtual container system that we're using. I'm running everything in a sandbox so that I don't have to worry about making any permanent changes to the underlying system. The problem is that there appears to be a memory issue with the container system. If you keep creating containers, even if you get rid of them after you use them, some part of them is left behind on disk and it clogs everything up. I'm currently looking into that issue. But I'm confident that I can get everything running with regards to my experiments and Magic stuff, so no worries there.
EDIT: I spoke with the machine's overseer who has identified the issue. If he has time today he'll try to implement the fix, and he might have some time tomorrow morning. But he's planning on going with fishing with his son and grandson tomorrow and I feel that if he can't get to it today, he can do it on Monday. After all, there's something magical about taking a young person on a fishing trip: the sunburn, the boredom, the insect bites... taken all together, it's a very powerful "character-building" exercise, and I wouldn't want to impede that in any way, lol.
Something just occurred to me about this gradient descent thing. As gnarly as they are, the error functions I'm optimizing are continuous. That means that if the gradient points me in a given direction, either there really is a smaller error that way, or some of the function is shoved in-between two 64-bit floats. I'm going to hope it's the former. Anyway, what I'm doing now makes no reference to what the changes actually do to the error. If, instead of using momentum, I just referred to the gradient, set the step size really high, and had it constantly scale the step-size down in response to an increased error, then it could adaptively find a good step size.
It's hard for me to figure out what affect this would have on run-time, but it could lead to something that has the decency to self-terminate when it reaches a local minimum that it can't hop out of. And a larger step size gives us bigger hops.
ETA: Tried bumping up the network size. This didn't change my profiling particularly, which suggests to me that the cost of this stuff is specifically the switching from Python to compiled code. It's not yet obvious to me how to reduce the number of calls. (Perhaps I could code the input data into the functions, allowing me to train an entire batch in one step. Then, I could try using scan to batch them up further, and stop there, because I would end up with an excruciating startup time, followed by some blazing loops.)
Olá e bem-vindo, Arthur! Sorry, I meant to reply to you sooner but was preoccupied. I'm happy to hear that you've found this work so interesting and that you're having fun with it.
Some recommendations I would make would be...
* Convert all upper case letters to lower case ones (i.e. A -> a), if you have not already. That reduces the size of the vocabulary of symbols.
* Use unary notation for all values. We've found that to be helpful when training the network to understand quantities.
But the biggest problem of all is the amount of input, as you've noted. You can expand the set of cards in the way you've described, and that's not a bad idea, but remember that the network is imitating you imitating Hearthstone using data from Magic. That alters the distributions of stats, obviously. The other problem is that it doesn't give us much in the way of new body text to work on, and body text is where most of the variation in the cards comes from.
However, if you had an algorithm that could generate all of that and generate authentic-looking cards, then we wouldn't need to train a network to do the job.
Hello Talcos,
First of all, thank you for replying me, and for the tips. I am going to change what you recommended, and see what happens.
Also, I forgot to tell you I am not using exactly the algorithm that is available in your github. The reason for that is because I've tried, but it seems like the input must be modeled for a Magic card, am I right? Therefore, I have used the neural net from Karpathy. Would you recommend me to change anything in his code?
First of all, thank you for replying me, and for the tips. I am going to change what you recommended, and see what happens.
Also, I forgot to tell you I am not using exactly the algorithm that is available in your github. The reason for that is because I've tried, but it seems like the input must be modeled for a Magic card, am I right? Therefore, I have used the neural net from Karpathy. Would you recommend me to change anything in his code?
Sincerely,
Arthur Medeiros.
No problem! And yes, I would recommend using Karpathy's original implementation. It should work well enough for you as is, honestly.
Also, I forgot to tell you I am not using exactly the algorithm that is available in your github. The reason for that is because I've tried, but it seems like the input must be modeled for a Magic card, am I right? Therefore, I have used the neural net from Karpathy. Would you recommend me to change anything in his code?
Indeed, the code in the mtg-rnn repo will only work for input that shares certain key properties with text that looks like the encoding produced by mtgencode.
Specifically, mtg-rnn has a specialized batcher that tries to break the input up into a series of cards, and then randomize them across epochs so that as little information as possible is lost due to chopping into training batches. The effect hasn't been experimentally validated, but it works at least as well as the original and the idea seems reasonable, no? In any case, you could still use it for hearthstone cards if you structure the input in the right way. You would have to separate cards with pairs of newline characters, and not have longer sequences of newlines anywhere (though single newlines inside cards are fine). If you do that it should just work. If you separate fields within the cards with vertical bar | characters, you could use the randomize_fields option as well, just like for magic cards.
The output is pretty verbose, so you should have a good idea of how it's working. If you want to use it and run into any issues, feel free to post an issue on the github. I don't have access to any of my machines right now but I will starting next week.
At this point I'm just patiently waiting. Hopefully we'll have the memory issue resolved tomorrow. Now, I won't have results for y'all right away, in that I have some experiments to run beforehand, then I need to confirm that everything in the modified training script works, and then, once training finishes, I'll have to write a new sampling script to interact with the stackRNN. That being said I'll probably have time to generate some higher resolution images before all that (I can't resist the opportunity), and I'll let y'all know what I come up with.
By the way, here are a few cards from this morning, combined with generated flavor text for fun.
Ritual of Rebirth 2R
Enchantment (Rare)
All creatures have double strike and deathtouch. The ritual is the most dangerous love of battle. It pain is eternally service fire, dreams learn to watch these, and its music leats the instinct.
#"Leats" is a perfectly cromulent verb.
Totempant Battlemage GG
Creature - Elf Warrior (Rare)
Hexproof
Whenever a creature with flying is put into a graveyard from the battlefield, draw a card. "The skies shall be left for an explosive."
2/2
Mirror Wall 2UU
Creature - Wall (Rare)
Defender
Whenever a creature you control deals combat damage to a player, put a token that's a copy of that creature onto the battlefield under your control. The reflections show not stupidial creatures, but many more.
0/3
#I'm impressed that the name matched the card so well. It's also interesting that it made this into a creature with defender, so it requires you to have other creatures on the field for it to be useful. I think this card could see print as is, maybe.
Necromantic Imp 1BB
Creature - Imp (Uncommon)
Flying
Whenever Necromantic Imp attacks, you may have it deal damage equal to its power to target creature or player. Necromancers are harder than fruit, and they are perfect.
1/1
I'm also wondering what exactly the rnn_size and num_layers influences in the training command do. I've used the tutorial on the github. (Epoch is low because I reran the training at lower eval_val_every at 100 for a quicker test if it was a onetime thing or not.
First, rnn_size indicates the number of recurrent network units per layer. Next, num_layers sets the number of such layers in the network. Higher values of rnn_size and num_layers mean a wider and deeper network.
You're fine! Can you try creating the cv directory inside the mtg-rnn directory? From what you're telling me, it sounds like you are creating the cv directory in your home directory, and not inside of the mtg-rnn folder. Also save the checkpoint to that directory and not, say, inside of a subdirectory under cv.
Thanks, that worked! I'll let it run for a while now so I can get some results that are readable instead of the nonsense I'm getting now and I'll make sure to share.
Awesome! No problem.
And yeah, if you're getting garbage, just let it percolate for awhile. Then we can see how things turn out and whether any of the parameters you chose could use some fine-tuning.
Ugh. I'm getting results, technically, but Theano is really jacking the iteration time up. (That's iterative development. The stuff I'm doing now, it may be slow, but I can't blame that on anything, since I've got nothing to compare it to.)
As I see it, my options are pretty much either to try redoing my custom (fast-iterating) node stuff using Numpy, or... actually, I should see what happens if I turn off compilation. Not great. Switch to float32? Too long to tell.
I'm going to take a break from touching code, maybe try to get some more matrix-aware calculus theory brought to bear on this. I'm not totally sure that Theano is a better fit for this problem than my hand-tuned stuff. If I have compilation on, its optimized code is just a little faster than my hand-written optimizer running in PyPy. Which uses no explicit vector math. And Theano has to compile it first.
Ugh. I'm getting results, technically, but Theano is really jacking the iteration time up. (That's iterative development. The stuff I'm doing now, it may be slow, but I can't blame that on anything, since I've got nothing to compare it to.)
As I see it, my options are pretty much either to try redoing my custom (fast-iterating) node stuff using Numpy, or... actually, I should see what happens if I turn off compilation. Not great. Switch to float32? Too long to tell.
Compilation here seems like a good plan. For example, when you know how many timesteps you'll have to do then you can unroll those computations pretty easily.
As for lowering the precision, I'm not sure that will benefit you overly much. If you do it right, lowering the precision would enable you to cram in more computation, but a lot of it comes down to what is expected by the framework that you're using and what they aim to optimize.
I'm going to take a break from touching code, maybe try to get some more matrix-aware calculus theory brought to bear on this. I'm not totally sure that Theano is a better fit for this problem than my hand-tuned stuff. If I have compilation on, its optimized code is just a little faster than my hand-written optimizer running in PyPy. Which uses no explicit vector math. And Theano has to compile it first.
I'm curious, what kind of hardware are you using (I apologize if I've asked this before)? Inefficiencies in the math can be costly, but we're mostly working with datasets with mere thousands of elements as opposed to, say, tens of millions (e.g. image data for recognition tasks).
Here are some hand-picked cards from both selections
spiteful brute (uncommon)
{5}{R}
creature ~ beast
when @ enters the battlefield, it deals 3 damage to each creature and each player.
(4/4)
#First card is just a nice thing in any draft I'd say
rain of shields (common)
{3}{B}{B}
sorcery
destroy target creature. add {G} or {W} to your mana pool. spend this mana only to cast myr spells or activate abilities of artifacts.
#First of two myr-related cards
crawling confusion (common)
{4}{B}
instant
destroy target nonblack creature. it can't be regenerated. its controller puts a 1/1 colorless myr artifact creature token onto the battlefield.
#Second myr-card
silent assassin (rare)
{B}{B}
creature ~ human assassin
{B}, {T}: target opponent reveals a card at random from his or her hand. you gain life equal to that card's converted mana cost.
(1/1)
#An Assassin that gets you life
spectral shict (uncommon)
{3}{U}
instant
uncast target noncreature spell.
draw a card.
#In general, where does uncast come from? It keeps popping up
returned minotaur (common)
{3}{R}
creature ~ minotaur warrior
when @ enters the battlefield, it deals 8 damage to target creature or player.
(3/3)
#Seems an ok common
liliana's sands (rare)
{2}{U}{U}
instant
until end of turn, all creatures gain "this creature attacks you or a planeswalker you control, reveal the top card of your library. if it's a land card, put it onto the battlefield. otherwise, put it into your hand.
#It's almost an interesting legal card, but not quite
viashino sandscout (common)
{2}{R}
creature ~ viashino scout
haste
at the beginning of your upkeep, if you control twench, put two 1/1 red and green goblin warrior creature tokens onto the battlefield.
(2/2)
#twench love
stormwatch eagle (common)
{2}{U}
creature ~ bird
flying
when @ enters the battlefield, destroy target nonblack creature.
{3}, {T}: tap target creature. it can't be regenerated.
(2/1)
#Tap, can't be regenerated. The counter to regenerate we've been looking for.
smoldering tora (uncommon)
{R}
instant
@ deals 1 damage to target creature or player. return @ to its owner's hand at the beginning of the next end step."
#Random closing", for the rest doesn't seem too bad.
visions (uncommon)
{1}{R}{R}
sorcery
put two 1/1 red elemental creature tokens onto the battlefield.
flashback {6}{R}
tithe to phoen (uncommon)
{W}
sorcery
you gain 2 life for each mointart permanent and you gain X life, where X is the number of cards in your hand.
#Finally some mointart love
stroke of the cridver (uncommon)
{U}
creature ~ human wizard
you have no creatures you control.
(1/2)
#These are not the creatures you're looking for?
spike breath (uncommon)
{2}{R}
instant
@ deals 2 damage to target creature. if @ was cast from a creature card at random, that creature gets +7/+6 until end of turn.
#Almost looks interesting
serra abomination (mythic rare)
{4}{W}{W}{B}{B}
creature ~ archon
flying
when @ enters the battlefield, you may search your library for an enchantment card that shares a color with the most common color among nontoken permanents the chosen player controls but is ties from white commander equal to the number of red mana symbols in the revealed card's converted mana cost.
(4/5)
#I think a train of thought got derailed here
flickerforce assassin (uncommon)
{3}{U}
creature ~ human wizard
morph~return a balian creature card from your graveyard to your hand.
(2/3)
#Alternate morph cost
soul libre (rare)
{X}{X}{R}{R}
sorcery
@ deals X damage to target creature or player.
at the beginning of your upkeep, you may return the damage cards from your graveyard to the battlefield.
#almost a legal X card
bronton senginer (uncommon)
{1}{B}
creature ~ insect marie
flying
threshold ~ as long as seven or more cards are in your graveyard, @ has "whenever a nontoken creature dies, you may put a land card from your hand onto the battlefield. = you draw X cards and you lose X life, where X is your life total.
(2/1)
#A great legal X card. And it only has a minor drawback for that draw ability!
jungle dia (rare)
{X}{R}{R}
sorcery
@ deals X damage divided as you choose among one or two target creatures and/or players.
And finally, an actual X card.
Uncast is used for things like "counter target spell" so that there isn't confusion with things like, "+1/+1 counters," etc, I believe.
Private Mod Note
():
Rollback Post to RevisionRollBack
Why did I ever think a signature in comic sans was a good idea?
I'm just running it on my laptop. I suppose compilation would make sense, since the actual algorithms are known and I'm just tweaking the parameters. The thing is, I'm kind of associating "compilation" with a low-level C-style language, and there are two things happening there: I'm not sure I'd trust any C code I write that's longer than a dozen lines or so, and whatever this is needs some major preprocessing to calculate the gradients. No matter what I do, I'd have to either learn a language I'm not really familiar with, or try using a non-default RPython.
Do you have any recommendations for a language that has good (basic or better) matrix/vector operation support, some kind of good macro system (since I can't just generate the node graph at runtime), and doesn't make it too easy to accidentally nuke my system? (It looks like Rust has BLAS support through a library. Dunno if that's the general space I should be aiming for.)
Ugh. I'm getting results, technically, but Theano is really jacking the iteration time up.[...]Switch to float32? Too long to tell.
Theano can only run on the gpu if you're using float32. Are you using any theano flags when you run python/ipython? Theano will use your cpu by default otherwise
I haven't been doing it on the GPU, and I'm not sure it'd matter given that initial compilation seems to take like five minutes for some reason, and I think I've been working with small enough matrices that the bound is actually passing them into the compiled functions (like, when I profile it with matrices of one size, and again with matrices of twice that size, it all works out the same). Like, if I want to effectively batch this stuff, I need to figure out how to rewrite the functions in terms of scan (which might speed up compilation, by just having less of it), and pass in stuff in jagged arrays, since the whole point of this code is that it auto-encodes variable-length data.
The thing is, I'm kind of associating "compilation" with a low-level C-style language, and there are two things happening there: I'm not sure I'd trust any C code I write that's longer than a dozen lines or so, and whatever this is needs some major preprocessing to calculate the gradients. No matter what I do, I'd have to either learn a language I'm not really familiar with, or try using a non-default RPython.
Believe me, I understand your hesitation. The last research paper I put out concerned making C code safer and controlling the damage it can do. I'm all for minimizing all human contact with C to the greatest extent possible.
One way of achieving that is through transcompilation (source-to-source compilation) of a higher-level language to C. That reduces everything to a close-to-the-metal form upon which we can perform very robust optimizations, and we get good safety guarantees because we're moving from a more restrictive language to a controlled subset of C. This appears to be the route that Theano takes, though I haven't used that framework much before.
Do you have any recommendations for a language that has good (basic or better) matrix/vector operation support, some kind of good macro system (since I can't just generate the node graph at runtime), and doesn't make it too easy to accidentally nuke my system? (It looks like Rust has BLAS support through a library. Dunno if that's the general space I should be aiming for.)
Right now I've been doing most of my work in Lua using Torch, with a bunch of my auxiliary code written in Python.
Many languages offer BLAS support. I've not thought to use Rust, but I've met with people who did development work on that language and they were very enthusiastic about Rust's flexibility, efficiency, and safety.
As for what languages to use, I'm sure Tiir would know much more than I.
---
Looks like the memory fix I'm waiting for will happen tonight. I look forward to getting some performance numbers for the new hardware.
Haha, I was just thinking about your grammar induction work the other day and was going to ask you how the work was coming along, and well, here you are.
Excellent work! I'm happy to hear that things are coming along just nicely for you. I'm quite happy to hear that you're able to eke out decent results with very little data. I suppose it helps that Magic English strives to eliminate ambiguities, redundancies, and issues like complicated co-references rarely show up.
And no, it's most definitely helpful. There still are issues with ungrammaticality, especially at higher temperatures. Having a good inferred grammar would help with constructing a garbage filter, meaning we could generate cards in ever greater numbers without having to worry about indecipherable irregularities creeping in.
With some combination of what you have and approaches like the continuous-bag-of-words, I'm confident that we could have reverse engineered ancient Egyptian hieroglyphics without the aid of the Rosetta Stone. We're about 216 years too late for that. But you've arrived just in time to help us with Magic, so that's wonderful.
EDIT: It's possible that everything I need for the high-end machine will be set up by the end of the day. Evidently the backup process took longer than expected. But that's okay. It happens. lol.
Woo, alright it's been awhile. Been working on a great many projects but I've been cherry-picking a bunch of interesting cards from my networks thus far. I always get a smile when I come across a new fish card, some of them are pretty interesting. I've set up spoilers below by color, and as I've said before I eventually plan on expanding this to a full draft set. Since some of the the cards are either missing information or their costs/power is so wildly unbalanced, I'm starting to consider at what point do I draw a line between "I need to edit these for the sake of the cube draft" and whether or not that ruins some of the charm?
Interesting thing to note is that I've ran a set like a solid week (50 something epochs I think it ended up at), but I find that most of my "interesting" cards come from the lower, more chaotic levels. Yes you have to sift through a lot of garbage, but I just find that the longer the system has to learn about the cards, the less creative it gets with them, and you get way too vanilla cards.
I'm still sorting through all the generated cards, but so far one of the most flavorful ones is "Demon of the Master's Tomb" (I've attached a pic)
Deaths' Calling (2BB)
Enchantment
2B: Choose a creature type. Target player loses 1 life for each +1/+1 counter on creatures of the chosen type.
Vengeful Graveness (B)
Creature – Nightmare Knight
Flying
When Vengeful Graveness enters the battlefield, sacrifice it unless you pay 1 life for each creature you control.
2 / 2
Power Screechings (1BB)
Sorcery
Target player shuffles all creature cards from their graveyard into their library, then draws a card. Tap all creatures that player controls, they get -1/-1 until end of turn.
Voracious War (BB)
Enchantment
BB: You lose one life. Creatures you control get +1/+1 until end of turn.
Cry of Undeath (3B)
Instant
Draw a card.
Morbid: If a creature died this turn, draw three cards instead
Flesh Raving (1B)
Enchant Creature - Aura
Enchanted creature gets +2/+0
When enchanted creature dies, attach Flesh Raving to a creature you control, then tap enchanted creature.
Prison Chanter (3B)
Creature – Human Wizard
BT: Place a 2/2 black zombie creature token onto the battlefield.
B, Discard a card: Target creature gets +X/+0 until end of turn where X is the discarded card's power.
0/4
Executioner Elemental (6B)
Creature – Elemental
Intimidate
At the beginning of your upkeep, sacrifice a creature.
Whenever an opponent casts a spell, each opponent loses 2 life for each card in his or her hand.
4 / 4
Crypt Squid (3B)
Creature – Fish
Shroud
T: Until end of turn, the next time target creature would deal damage to you, prevent that damage, its controller may draw a card at the beginning of the next turn's upkeep.
3 / 1
Train Dread (2BB)
Instant
Return target creature card from your graveyard to the battlefield. That creature gets +1/+1 until end of turn
Longrats (3B)
Creature - Zombie Beast
Whenever Longrats deals damage, you gain that much life.
1 / 4
Nephealia Lavazarm (3BB)
Legendary Creature - Demon Wizard
Whenever Nephealia Lavazarm deals combat damage to a player, put that many 1/1 black island artifact creature tokens onto the battlefield.
3 / 3
Plague Butcher [1B]
Creature - Rat
T: Plague Diviner and Target Creature get -2/-2 until end of turn.
2 / 1
Dread Howling [5B]
Sorcery
Each player puts the top card of his or her library into his or her graveyard, then discards cards equal to that card's converted mana cost.
Deathskipper [5B]
Creature - Nightmare Hound
Landfall: Whenever a land enters the battlefield under your control, Deathskipper deals 1 damage to each creature and each player.
4 / 4
Mana Claws [3B]
Sorcery
As an additional cost to cast Mana Claws, sacrifice a creature. Target player shuffles his or her hand into his or her library and draws cards equal to the sacrificed creature's mana cost.
Engineered Evil [5BB]
Creature - Horror
Whenever Engineered Evil attacks or is blocked, you may pay 2 life, if you do, Engineered Evil gets +2/+2 until end of turn.
7 / 5
Skeletal Vanguard [B]
Creature - Zombie Samurai
If Skeletal Vanguard is in your graveyard, you may pay B to return it to the battlefield. It gains gets +1/+1 until end of turn.
1 / 1
Guild Nightstalker [B1]
Creature - Human Samurai
When Guild Nightstalker blocks, it becomes Indestructible until end of turn.
If R was spent to cast Guild Nightstalker, you may put a +1/+1 counter on it.
2 / 1
Warblood Servant [3B]
Creature - Barbarian Zombie
Whenever Warblood Servant attacks, if damage would be dealt to it, prevent that damage.
3/3
Mind Force [1BB]
Instant
Each Attacking Creature gets -2/-2 until end of turn.
Necroprice [5BB]
Sorcery
All creatures get +2/+2 and deathtouch until end of turn, regenerate each creature you control.
Feverbrain Enforcer [3BB]
Creature - Zombie Mercenary
BB: Feverbrain Enforcer gets +2/+0 and gains trample until end of turn.
4 / 4
Void Eater [1B]
Creature - Snake Horror
Elemental creatures you control get +2/+2.
1 / 2
Rise of the Damned []
Enchantment
BB: Target non-creature permanent becomes a 1/1 Zombie creature until end of turn.
Madfensive Djinn (UU)
Creature – Elemental
Flying
When Madfensive Djinn dies, return all lands you control to their owner's hand.
5/3
Barbed Mage (1UU)
Creaure – Human Wizard
RR: Target creature gets +1/+1 and gains first strike until end of turn.
1 / 3
Mindpulse Squall (3UU)
Creature – Bird
Flying, First Strike
UU: Reveal your hand, Mindpulse Squall gains +1/+1 until end of turn for each instant or sorcery card revealed this way.
2 / 2
Huntling Rowler ( 4UU)
Creature - Shapeshifter
UU: You may reveal the top card of your library. If its a land card, Huntling Rowler gains Mountainwalk, Forestwalk, Swampwalk, and Trample until end of turn. If it is a human, target player sacrifices a creature.
3 / 3
Sarcal, the Angelic Explorer (7UU)
Legendary Creature – Island Shaman
Delve (Each card you exile from your graveyard while casting this spell pays for 1)
Creatures you control have Flying.
UU: Choose a color, each other creature with flying gains protection from the chosen color until end of turn.
3 / 4
Fated Voyager (1UU)
Creature – Human Artificer
Fated Voyager enters the battlefield with a +1/+1 counter on it.
T, Remove a +1/+1 counter from Fated Voyager: Reveal the top card of your library, if it is a land, place place two +1/+1 counters on Fated Voyager; if it is an Instant or Sorcery, prevent all damage that would be dealt to target creature or player this turn; if it is creature, gain control of target creature an opponent controls that shares a creature type with it.
2 / 1
Mifasu's Sphere (UUUU)
Sorcery
Suspend 4-U (Rather than cast this card from your hand, pay U and exile it with four time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.)
Each player selects one land and one non-land permanent they control and shuffle all other cards from the battlefield into their libraries.
Havok Apprenticeship (2UU)
Enchantment - Aura
At the beginning of you upkeep, attach Havok Apprenticeship to target permanent you control.
If enchanted permanent is a land, it becomes a 2/2 spirit creature, it is still a land; if it is an artifact, it becomes a 1/1 dragon creature with flying in addition to its other types; if it is an enchantment, it becomes a 1/1 legendary wizard enchantment creature, then place four +1/+1 counters on it.
Skyblight (1UU)
Instant
Creatures get -X/-0 until end of turn, where X is the number of blue creature cards in all graveyards.
Hazen, Mystic Guardian (3U)
Legendary Creature - Human Wizard
U: Target creature gets -1/0 until end of turn.
1U: Uncast target spell unless its controller pays 1.
2 / 2
Seal Scorcher (3U)
Creature - Fish
Seal Scorcher enters the battlefield with a +1/+1 counter on it for each mountain you control.
1 / 1
Memory Familiar (U)
Creature - Spirit
U: Look at the top five cards of your library.
0 / 1
Dark Skyrider (3U)
Creature - Fish
Flying
R: Dark Scarrider gains +1/+0 until end of turn.
Nephalia's Might (UU)
Enchantment - Enchant Artifact
Enchanted Artifact gets "Tap: Target creature you control gets +4/-4 until end of turn."
Chimeric Distortion [UU]
Instant
Target non-blue creature gets +2/+2 and gains first strike until end of turn.
Signog, Downkin Mentor [2U]
Legendary Creature - Merfolk Wizard
U: Target creature gets +X/+0 until end of turn, where X is Signog, Downkin Mentor 's power.
1 / 1
Whispered Souls [1UU]
Creature - Spirit
Hexproof, Flash
When @ enters the battlefield, return target sorcery card from your graveyard to your hand.
0/2
Dream Burdens [3U]
Enchantment
Cumulative Upkeep U
Whenever a player draws a card, that player discards a card.
Sandbar Scout [U]
Creature - Merfolk Warrior
Doublestrike
At the beginning of your upkeep, sacrifice Sandbar Scout unless you sacrifice 1 land.
2 / 2
Scroll Pact (2UU)
Sorcery
Discard your hand.
Search your library for up to two cards, put them in your hand, then shuffle your library.
Shadow-Water Striker [3U]
Creature - Fish
Whenever Shadow-Water Striker deals damage, you gain that much life.
Islands you control gain first strike.
2 / 3
Seablood [4U]
Creature - Elemental
Flying
4 / 2
(1WW)
Enchantment Aura – Enchant Creature
Whenever enchanted creature deals damage, you may gain 1 life for each land you control.
Knell of Rockrad (2W)
Creature – Human Warrior
3: Knell of Rockrad gets +1/+1 until end of turn for each plains you control.
1 / 2
Diabolic Spirit (2W)
Creature - Spirit
Flying
When Diabolic Spirit comes enters the battlefield, put a 3/3 black Zombie creature token onto the battlefield.
1B: Target black creature gains +1/+1 until end of turn.
1/1
Titania Pridebearer (3WW)
Creature – Human Cleric
Whenever a creature you control is put into a graveyard from the battlefield, you may return a nonland permanent from your graveyard to your hand.
1 / 1
Targin Sacred Funeral (2W)
Sorcery
Target white creature gains +1/+1 until end of turn.
At the beginning of your upkeep, if Targin Sacred Funeral is in your graveyard, prevent all combat damage that would be dealt to target creature this urn.
Murit of the Dead (3W)
Creature – Zombie Artificer
1W: Put a +1/+1 counter on target artifact, creature, or land. It becomes a 1/1 zombie creature in addition to its other types until end of turn.
1 / 1
Trompling Giant (3WW)
Vigilance, Trample
Other white creature you control do not untap during their controllers' untap steps.
4 / 5
Opal Ward (1W)
Instant
Target creature gets -6/-0 until end of turn.
Battle Spoils [3W]
Instant
Remove target tapped creature from combat and exile it, then return it to the battlefield tapped.
Morbid: That creature does not untap during its owners next upkeep if a creature died this turn.
Croves, Time Thrasher [2WW]
Legendary Creature - Kor Soldier
Flash, Trample
When Croves, Time Thrasher attacks, put a 1/1 white soldier creature token onto the battlefield tapped and attacking.
Fading 2 (this creature enter the battlefield with 2 fade counters on it. At the beginning of your upkeep, remove a fade country from it. If you can't, sacrifice it.)
3 / 5
Sunscale Gambit [1W]
Instant
Target blocked creature gains protection from a color of your choice until end of turn, then place a +1/+1 counter on it for each Enchantment you control.
Celestial Incite [3W]
Search your library for a land card and put that card onto the battlefield. Then each player exiles his or her hand and puts any permanents exiled this way onto the battlefield tapped.
Rebel Wish [1W]
Instant
Creatures you control get +0/+3 and gain Flying until end of turn.
Battlefall [1W]
Enchantment - Aura
Whenever a player casts a spell, if you control a plains you may gain 2 life.
Pay 2 life for each plains you control: put a creature from your hand onto the battlefield, tapped.
Spirit of the Dragon [4W]
Legendary Creature - Spirit
Flying
Whenever Spirit of the Dragon deals combat damage to a player, put two +1/+1 counters on it, then target opponent loses 3 life.
2 / 5
Mystic Devastation [1WW]
Sorcery
Target player reveals the top card of their library, then each player sacrifices all permanents with converted mana cost equal to the revealed card.
Near-Death Crusader [2WW]
Fading 2:
6 / 2
Wall of Denium [3WW]
Legendary Creature - Wall
1WW: Regenerate Wall of Denium
Wall of Denium may block any number of creatures.
0/8
Deathless Keeper [4W]
Creature - Human Knight
First Strike
Whenever you cast a spell, if Deathless Keeper is in your graveyard you may return it to the battlefield tapped.
4 / 4
Trench Assassin (GG)
Creature – Human Druid
Tap: Return Trench Assassin and target creature you don't control to their owner's hand.
1 / 2
Ambush Archer GG
Creature – Elf
Flash
When Ambush Archer enters the battlefield, it deals 2 damage to target attacking creature.
1 / 1
Storm Forged (1GG)
Creature – Spirit Forest Warrior
At the beginning of your upkeep, add a +1/+1 counter to Storm Forged.
Remove a +1/+1 counter: Add 1 mana of any color to your mana pool
2 / 2
Ardget of Treefolk (1G)
Creature – Elf Advisor
When Ardget of Treefolk enters the battlefield, draw a card.
Tap an untapped creature you control: Untap target forest.
1 / 2
Scapo's Druids (3G)
Creature – Rat Shaman
BG: Target creature gets -X/-X until end of turn where X is equal to the number of black creatures you control.
3 / 1
Chant of the Portal Breaker (3G)
Reveal your hand, target opponent puts a card from your hand onto the battlefield under their control. Choose a color, then return all creatures of the chosen color from your graveyard onto the battlefield.
Shambling Bear (GGG)
Legendary Creature - Elf Wizard
GG: Regenerate target creature.
T: Target land becomes an X/X Elemental Beast creature with trample until end of turn where X is equal to the number of forests you control, it is still a land.
1 / 1
Snakeboon [1G]
Creature - Snake
Whenever Snakeboon becomes blocked, you may gain 3 life.
1 / 1
Wanderer of Islarren [4GG]
Legendary Creature - Human Druid
Whenever another permanent you control attacks, if it's a land, it gets +4/+4 until end of turn.
3 / 5
Distortion Growth [1G]
Creature - Ooze
When Distortion Growth enters the battlefield, if R was spent to cast Distortion Growth, you may choose a red instant or sorcery card from your graveyard and return it to your hand.
1 / 1
Slaughter Vines [1G]
Creature - Elemental
When Slaughter Vines enters the battlefield, you may draw a card at the beginning of the next end step.
1G, Tap: Target creature gets +2/+1 until end of turn.
1 / 1
Hanoma Companion [2G]
Creature - Wolf
At the beginning of your upkeep, if you control two or more mountains, return Hanoma Companion from your graveyard to your hand.
3 / 3
Cobweb Scourge [1G]
Creature - Elf Warrior
When Cobweb Scourge attacks, you may tap target creature, it doesn't untap during its controller's next untap step.
1 / 2
Deep Shade [1G]
Creature - Beast
Deep Shade cannot be blocked by creatures.
2 / 1
Irondrag Fanatic (3RR)
Creature - Minotaur
When Irondrag Fanatic enters the battlefied, put a +1/+1 counter on each other creature you control. When Irondrag Fanatic dies, if you control four or more creatures with a +1/+1 counter, return it to the battlefield.
1/3
Elves Avenger (2RR)
Creature – Human Warrior
Creatures with power 3 or less cannot deal combat damage to you.
Whenever a creature is dealt damage by a green creature, that creature gets +1/+1 until end of turn.
2 / 2
Cavalier Caromancer (2R)
Creature – Goblin Wizard
Haste
Whenever Cavalier Caromancer or a permanent enters the battlefield, its controller sacrifices it unless its controller pays (2).
2 / 1
Powder Firespark (3RR)
Creature - Goblin
When Powder Firespark enters the battlefield, tap all lands.
Sacrifice Powder Firespark: destroy target tapped land.
1 / 1
Domain (1RR)
Sorcery
Return target creature card from your graveyard to your hand.
Restless Mano (2R)
Creature – Satyr Shaman
RR: Put a +1/+1 counter on target creature, it gains defender until end of turn.
Sacrifice Restless Mano: Untap target tapped creature an opponent controls and gain life equal to its toughness.
2 / 2
Monolith of War (3R)
Enchantment – Enchant Mountain
Spells you cast cost 1 less to cast.
Goblin Unchangeling
Creature - Goblin Warrior
R1: Target creature you control gets +1/+1 until end of turn unless an opponent pays 1.
2 / 2
Zabeshi Archer (4R)
Creature - Human Berserker
Whenever Zabeshi Archer attacks or blocks, it deals 2 damage divided as you choose among any number of creature and/or players.
3 / 3
Berserk Escape (1R)
Instant
As an additional cost to cast Berserk Escape, sacrifice a mountain.
Target blocked creature gets +5/+0 and has first strike.
Curse of Wildrun (1RR)
Instant
Choose one
- Prevent all combat damage that would be dealt to blocked creatures this turn.
- Target creature gets -3/-3 until end of turn for each creature blocking it.
Gloryblaster Goblin (1RR)
Creature - Goblin
Haste
When Gloryblaster Goblin deals combat damage to a player, destroy target land then sacrifice Gloryblaster Goblin.
2 / 1
Salchan ,General of Riftsaan [4RR]
Legendary Creature - Rhino
Indestructable
Salchan ,General of Riftsaan can block any number of creatures with power 2 or less.
R: Target creature gets +1/+0 until end of turn.
4 / 3
Bandit Minion [1R]
Creature - Hound
Whenever a goblin attacks, it can't be blocked this turn.
2 / 1
Slaughter Elf [1R]
Creature - Elf
Haste
1 / 2
Sakamaster Strike [1RR]
Instant
Counter target spell unless its controller pays 2 life.
Blithering Scout [R1]
Creature - Goblin
Blithering Scout gets +1/+1 as long as there are no +1/+1 counters on creatures you control.
Blithering Scout can't attack or block unless its controller pays [2].
2 / 2
Pyre of Souls [3RR]
Return target creature with converted mana cost 4 or less from your graveyard to the battlefield.
Deathless Fire [1R]
Creature - Elemental
1W: Deathless Fire gets +1/+1 and has lifelink until end of turn.
1 / 2
Judgement of Grag [R]
Enchantment - Aura
Enchant Creature
As an additional cost to cast Judgement of Grag, sacrifice a creature.
Whenever enchanted creature deals combat damage, place a +1/+1 counter on it.
Slayerwind [1R]
Creature - Human Warrior
Haste
When Slayerwind enters the battlefield, choose a color. Slayerwind gets +1/+0 for each creature your opponents control of chosen color until end of turn.
2 / 1
Thunderscale Drake [6R]
Creature - Dragon
Flying
When Thunderscale Drake enters the battlefield, destroy target creature. Thunderscale Drake deals 3 damage to that creature's controller.
4 / 4
Burnbringer [4RR]
Creature - Orc Shaman
4, Sacrifice Burnbringer: target player loses 5 life.
5 / 1
Glory of the Brass Dawn [5R]
Sorcery
Glory of the Brass Dawn can't be countered.
Destroy all permanents. At the beginning of your next upkeep, you may return a non-basic land from your graveyard to the battlefield.
Wail of Mercy [2R]
Enchantment
Whenever a token creature enters the battlefield, exile it.
Fury Seeker [2RR]
Creature - Elemental
Flying, Linklink
2R: Target creature gets +1/+1 and gains first strike until end of turn.
2 / 3
Flamestone Lifebringer [2R]
Creature - Elemental Shaman
At the beginning of your upkeep, put a +1/+1 counter on target land. It becomes a 1/1 creature, it is still a land.
2 / 2
../../../rose/src/util/Sawyer/AddressMap.h:468:22: error: use 'template' keyword
to treat 'traverse' as a dependent template name
return map_->traverse<typename AddressMap::Visitor>(visitor, *th...
^
template
Reading StackOverflow on related errors makes me a little leery of following its advice, but I'm not sure what else I would do. On further investigation, I'm not even sure where this code is.
../../../rose/src/util/Sawyer/AddressMap.h:468:22: error: use 'template' keyword
to treat 'traverse' as a dependent template name
return map_->traverse<typename AddressMap::Visitor>(visitor, *th...
^
template
Reading StackOverflow on related errors makes me a little leery of following its advice, but I'm not sure what else I would do. On further investigation, I'm not even sure where this code is.
Wait, what is this? And are you using ROSE? I'm a contributor to that project. Sawyer is an event logger. As to why there is an error, I'd have to investigate.
EDIT: By the way, LASture, I love the cards. They're a nice mix of hilarious and awesome.
EDIT(2): Oh lord, this new hardware is unbelievably fast. I train a three-layer LSTM network with 512 units per layer, sequence length of 200, and batch size of 100, at a speed of 1.36 seconds per batch. In other words, I can fully train a network to generate Magic cards in under two hours as opposed to, say, 20-26 hours. That is.. wow. That is fast. Wow. I'll have to play with that later.
../../../rose/src/util/Sawyer/AddressMap.h:468:22: error: use 'template' keyword
to treat 'traverse' as a dependent template name
return map_->traverse<typename AddressMap::Visitor>(visitor, *th...
^
template
Reading StackOverflow on related errors makes me a little leery of following its advice, but I'm not sure what else I would do. On further investigation, I'm not even sure where this code is.
Wait, what is this? And are you using ROSE? I'm a contributor to that project. Sawyer is an event logger. As to why there is an error, I'd have to investigate.
This is output from make, shortly before it gave up. So I'm not "using" ROSE so much as trying to use it. Not totally sure it was in a valid state to start with, since I had to hack determine-os.m4 to have some vague knowledge of the existence of Yosemite.
Since some of the the cards are either missing information or their costs/power is so wildly unbalanced, I'm starting to consider at what point do I draw a line between "I need to edit these for the sake of the cube draft" and whether or not that ruins some of the charm?
That was one reason I've shifted over from "filling out a set skeleton" to "building a Greatest Hits cube". I didn't like how much hand editing was required to make the former work--especially given that the current methods available for "priming" gum up the RNN's thought process so much.
I will make small edits to a card that's nearly there, such as removing a spurious clause added to the end of an otherwise rules-legal sentence, defining an undefined token type, or replacing "Echo" with "Kicker" in a card that has an "if it was kicked" clause. But I haven't figured out where I fall on adjusting mana costs.
EDIT(2): Oh lord, this new hardware is unbelievably fast. I train a three-layer LSTM network with 512 units per layer, sequence length of 200, and batch size of 100, at a speed of 1.36 seconds per batch. In other words, I can fully train a network to generate Magic cards in under two hours as opposed to, say, 20-26 hours. That is.. wow. That is fast. Wow. I'll have to play with that later.
That's awesome stuff... will it be as quick when you try the StackRNN implementation? I'm guessing a 1080p Starry Night Jace is also within reach too?
Is it just the powerful GPU making the training so fast (presumably you're training using the GPU) or are the 20 CPU cores also helping?
Private Mod Note
():
Rollback Post to RevisionRollBack
To post a comment, please login or register a new account.
My LinkedIn profile... thing (I have one of those now!).
My research team's webpage.
The mtg-rnn repo and the mtg-encode repo.
There are a few avenues of optimization here. One is to try other solvers, which is actually kind of intimidating. Another is to finally start dropping checkpoints (probably just write a pickle to disk). I'm aware, as well, of one possible optimization to the generated functions.
For now, I'm seeing if a call graph of a small run reveals any obvious inefficiencies. I used this to some effect on the Pypy version of this code, but eventually I couldn't see how to make things faster. This looks like it'll be a similar kind of thing; lots and lots of the logic in this code lives in compiled code, but I won't know for sure if I don't look. I'll look into setting up a checkpoint system tomorrow.
ETA: Theano is... peculiar. I do see some some opportunities for modest optimization, though (like 5%). I can try them out, sure.
ETA: Okay, that's a bit of an improvement. Not sure if there's any way to tune the generated code.
Olá e bem-vindo, Arthur! Sorry, I meant to reply to you sooner but was preoccupied. I'm happy to hear that you've found this work so interesting and that you're having fun with it.
Some recommendations I would make would be...
* Convert all upper case letters to lower case ones (i.e. A -> a), if you have not already. That reduces the size of the vocabulary of symbols.
* Use unary notation for all values. We've found that to be helpful when training the network to understand quantities.
But the biggest problem of all is the amount of input, as you've noted. You can expand the set of cards in the way you've described, and that's not a bad idea, but remember that the network is imitating you imitating Hearthstone using data from Magic. That alters the distributions of stats, obviously. The other problem is that it doesn't give us much in the way of new body text to work on, and body text is where most of the variation in the cards comes from.
However, if you had an algorithm that could generate all of that and generate authentic-looking cards, then we wouldn't need to train a network to do the job.
What this means is that I get much faster turnaround time when I do experiments. I can try out a change, and get results rapidly. I can figure out what works and what doesn't much more quickly.
And you're quite right. Bigger is not always better. There's a general relationship between size/complexity of a problem and the amount of computational resources you have to throw at it to get a good solution, but the more learnable parameters you have in your system, the more difficult it is to train.
---
Still working out that bug I mentioned last night. The problem isn't with Torch or CUDA or anything like that, it's with the virtual container system that we're using. I'm running everything in a sandbox so that I don't have to worry about making any permanent changes to the underlying system. The problem is that there appears to be a memory issue with the container system. If you keep creating containers, even if you get rid of them after you use them, some part of them is left behind on disk and it clogs everything up. I'm currently looking into that issue. But I'm confident that I can get everything running with regards to my experiments and Magic stuff, so no worries there.
EDIT: I spoke with the machine's overseer who has identified the issue. If he has time today he'll try to implement the fix, and he might have some time tomorrow morning. But he's planning on going with fishing with his son and grandson tomorrow and I feel that if he can't get to it today, he can do it on Monday. After all, there's something magical about taking a young person on a fishing trip: the sunburn, the boredom, the insect bites... taken all together, it's a very powerful "character-building" exercise, and I wouldn't want to impede that in any way, lol.
My LinkedIn profile... thing (I have one of those now!).
My research team's webpage.
The mtg-rnn repo and the mtg-encode repo.
It's hard for me to figure out what affect this would have on run-time, but it could lead to something that has the decency to self-terminate when it reaches a local minimum that it can't hop out of. And a larger step size gives us bigger hops.
ETA: Tried bumping up the network size. This didn't change my profiling particularly, which suggests to me that the cost of this stuff is specifically the switching from Python to compiled code. It's not yet obvious to me how to reduce the number of calls. (Perhaps I could code the input data into the functions, allowing me to train an entire batch in one step. Then, I could try using scan to batch them up further, and stop there, because I would end up with an excruciating startup time, followed by some blazing loops.)
Hello Talcos,
First of all, thank you for replying me, and for the tips. I am going to change what you recommended, and see what happens.
Also, I forgot to tell you I am not using exactly the algorithm that is available in your github. The reason for that is because I've tried, but it seems like the input must be modeled for a Magic card, am I right? Therefore, I have used the neural net from Karpathy. Would you recommend me to change anything in his code?
Sincerely,
Arthur Medeiros.
No problem! And yes, I would recommend using Karpathy's original implementation. It should work well enough for you as is, honestly.
My LinkedIn profile... thing (I have one of those now!).
My research team's webpage.
The mtg-rnn repo and the mtg-encode repo.
Indeed, the code in the mtg-rnn repo will only work for input that shares certain key properties with text that looks like the encoding produced by mtgencode.
Specifically, mtg-rnn has a specialized batcher that tries to break the input up into a series of cards, and then randomize them across epochs so that as little information as possible is lost due to chopping into training batches. The effect hasn't been experimentally validated, but it works at least as well as the original and the idea seems reasonable, no? In any case, you could still use it for hearthstone cards if you structure the input in the right way. You would have to separate cards with pairs of newline characters, and not have longer sequences of newlines anywhere (though single newlines inside cards are fine). If you do that it should just work. If you separate fields within the cards with vertical bar | characters, you could use the randomize_fields option as well, just like for magic cards.
The output is pretty verbose, so you should have a good idea of how it's working. If you want to use it and run into any issues, feel free to post an issue on the github. I don't have access to any of my machines right now but I will starting next week.
By the way, here are a few cards from this morning, combined with generated flavor text for fun.
Ritual of Rebirth
2R
Enchantment (Rare)
All creatures have double strike and deathtouch.
The ritual is the most dangerous love of battle. It pain is eternally service fire, dreams learn to watch these, and its music leats the instinct.
#"Leats" is a perfectly cromulent verb.
Totempant Battlemage
GG
Creature - Elf Warrior (Rare)
Hexproof
Whenever a creature with flying is put into a graveyard from the battlefield, draw a card.
"The skies shall be left for an explosive."
2/2
Mirror Wall
2UU
Creature - Wall (Rare)
Defender
Whenever a creature you control deals combat damage to a player, put a token that's a copy of that creature onto the battlefield under your control.
The reflections show not stupidial creatures, but many more.
0/3
#I'm impressed that the name matched the card so well. It's also interesting that it made this into a creature with defender, so it requires you to have other creatures on the field for it to be useful. I think this card could see print as is, maybe.
Necromantic Imp
1BB
Creature - Imp (Uncommon)
Flying
Whenever Necromantic Imp attacks, you may have it deal damage equal to its power to target creature or player.
Necromancers are harder than fruit, and they are perfect.
1/1
My LinkedIn profile... thing (I have one of those now!).
My research team's webpage.
The mtg-rnn repo and the mtg-encode repo.
Does the directory "cv" exist? If not, create it. Otherwise, do you have permission to write in that directory?
First, rnn_size indicates the number of recurrent network units per layer. Next, num_layers sets the number of such layers in the network. Higher values of rnn_size and num_layers mean a wider and deeper network.
My LinkedIn profile... thing (I have one of those now!).
My research team's webpage.
The mtg-rnn repo and the mtg-encode repo.
Let me know if you run into any issues.
My LinkedIn profile... thing (I have one of those now!).
My research team's webpage.
The mtg-rnn repo and the mtg-encode repo.
Awesome! No problem.
And yeah, if you're getting garbage, just let it percolate for awhile. Then we can see how things turn out and whether any of the parameters you chose could use some fine-tuning.
My LinkedIn profile... thing (I have one of those now!).
My research team's webpage.
The mtg-rnn repo and the mtg-encode repo.
As I see it, my options are pretty much either to try redoing my custom (fast-iterating) node stuff using Numpy, or... actually, I should see what happens if I turn off compilation. Not great. Switch to float32? Too long to tell.
I'm going to take a break from touching code, maybe try to get some more matrix-aware calculus theory brought to bear on this. I'm not totally sure that Theano is a better fit for this problem than my hand-tuned stuff. If I have compilation on, its optimized code is just a little faster than my hand-written optimizer running in PyPy. Which uses no explicit vector math. And Theano has to compile it first.
Compilation here seems like a good plan. For example, when you know how many timesteps you'll have to do then you can unroll those computations pretty easily.
As for lowering the precision, I'm not sure that will benefit you overly much. If you do it right, lowering the precision would enable you to cram in more computation, but a lot of it comes down to what is expected by the framework that you're using and what they aim to optimize.
I'm curious, what kind of hardware are you using (I apologize if I've asked this before)? Inefficiencies in the math can be costly, but we're mostly working with datasets with mere thousands of elements as opposed to, say, tens of millions (e.g. image data for recognition tasks).
My LinkedIn profile... thing (I have one of those now!).
My research team's webpage.
The mtg-rnn repo and the mtg-encode repo.
Uncast is used for things like "counter target spell" so that there isn't confusion with things like, "+1/+1 counters," etc, I believe.
Do you have any recommendations for a language that has good (basic or better) matrix/vector operation support, some kind of good macro system (since I can't just generate the node graph at runtime), and doesn't make it too easy to accidentally nuke my system? (It looks like Rust has BLAS support through a library. Dunno if that's the general space I should be aiming for.)
Haha, I like the results.
Believe me, I understand your hesitation. The last research paper I put out concerned making C code safer and controlling the damage it can do. I'm all for minimizing all human contact with C to the greatest extent possible.
One way of achieving that is through transcompilation (source-to-source compilation) of a higher-level language to C. That reduces everything to a close-to-the-metal form upon which we can perform very robust optimizations, and we get good safety guarantees because we're moving from a more restrictive language to a controlled subset of C. This appears to be the route that Theano takes, though I haven't used that framework much before.
Right now I've been doing most of my work in Lua using Torch, with a bunch of my auxiliary code written in Python.
Many languages offer BLAS support. I've not thought to use Rust, but I've met with people who did development work on that language and they were very enthusiastic about Rust's flexibility, efficiency, and safety.
As for what languages to use, I'm sure Tiir would know much more than I.
---
Looks like the memory fix I'm waiting for will happen tonight. I look forward to getting some performance numbers for the new hardware.
My LinkedIn profile... thing (I have one of those now!).
My research team's webpage.
The mtg-rnn repo and the mtg-encode repo.
Excellent work! I'm happy to hear that things are coming along just nicely for you. I'm quite happy to hear that you're able to eke out decent results with very little data. I suppose it helps that Magic English strives to eliminate ambiguities, redundancies, and issues like complicated co-references rarely show up.
And no, it's most definitely helpful. There still are issues with ungrammaticality, especially at higher temperatures. Having a good inferred grammar would help with constructing a garbage filter, meaning we could generate cards in ever greater numbers without having to worry about indecipherable irregularities creeping in.
With some combination of what you have and approaches like the continuous-bag-of-words, I'm confident that we could have reverse engineered ancient Egyptian hieroglyphics without the aid of the Rosetta Stone. We're about 216 years too late for that. But you've arrived just in time to help us with Magic, so that's wonderful.
EDIT: It's possible that everything I need for the high-end machine will be set up by the end of the day. Evidently the backup process took longer than expected. But that's okay. It happens. lol.
My LinkedIn profile... thing (I have one of those now!).
My research team's webpage.
The mtg-rnn repo and the mtg-encode repo.
Interesting thing to note is that I've ran a set like a solid week (50 something epochs I think it ended up at), but I find that most of my "interesting" cards come from the lower, more chaotic levels. Yes you have to sift through a lot of garbage, but I just find that the longer the system has to learn about the cards, the less creative it gets with them, and you get way too vanilla cards.
I'm still sorting through all the generated cards, but so far one of the most flavorful ones is "Demon of the Master's Tomb" (I've attached a pic)
Deaths' Calling (2BB)
Enchantment
2B: Choose a creature type. Target player loses 1 life for each +1/+1 counter on creatures of the chosen type.
Vengeful Graveness (B)
Creature – Nightmare Knight
Flying
When Vengeful Graveness enters the battlefield, sacrifice it unless you pay 1 life for each creature you control.
2 / 2
Power Screechings (1BB)
Sorcery
Target player shuffles all creature cards from their graveyard into their library, then draws a card. Tap all creatures that player controls, they get -1/-1 until end of turn.
Voracious War (BB)
Enchantment
BB: You lose one life. Creatures you control get +1/+1 until end of turn.
Cry of Undeath (3B)
Instant
Draw a card.
Morbid: If a creature died this turn, draw three cards instead
Flesh Raving (1B)
Enchant Creature - Aura
Enchanted creature gets +2/+0
When enchanted creature dies, attach Flesh Raving to a creature you control, then tap enchanted creature.
Prison Chanter (3B)
Creature – Human Wizard
BT: Place a 2/2 black zombie creature token onto the battlefield.
B, Discard a card: Target creature gets +X/+0 until end of turn where X is the discarded card's power.
0/4
Executioner Elemental (6B)
Creature – Elemental
Intimidate
At the beginning of your upkeep, sacrifice a creature.
Whenever an opponent casts a spell, each opponent loses 2 life for each card in his or her hand.
4 / 4
Crypt Squid (3B)
Creature – Fish
Shroud
T: Until end of turn, the next time target creature would deal damage to you, prevent that damage, its controller may draw a card at the beginning of the next turn's upkeep.
3 / 1
Train Dread (2BB)
Instant
Return target creature card from your graveyard to the battlefield. That creature gets +1/+1 until end of turn
Longrats (3B)
Creature - Zombie Beast
Whenever Longrats deals damage, you gain that much life.
1 / 4
Nephealia Lavazarm (3BB)
Legendary Creature - Demon Wizard
Whenever Nephealia Lavazarm deals combat damage to a player, put that many 1/1 black island artifact creature tokens onto the battlefield.
3 / 3
Plague Butcher [1B]
Creature - Rat
T: Plague Diviner and Target Creature get -2/-2 until end of turn.
2 / 1
Dread Howling [5B]
Sorcery
Each player puts the top card of his or her library into his or her graveyard, then discards cards equal to that card's converted mana cost.
Deathskipper [5B]
Creature - Nightmare Hound
Landfall: Whenever a land enters the battlefield under your control, Deathskipper deals 1 damage to each creature and each player.
4 / 4
Mana Claws [3B]
Sorcery
As an additional cost to cast Mana Claws, sacrifice a creature. Target player shuffles his or her hand into his or her library and draws cards equal to the sacrificed creature's mana cost.
Engineered Evil [5BB]
Creature - Horror
Whenever Engineered Evil attacks or is blocked, you may pay 2 life, if you do, Engineered Evil gets +2/+2 until end of turn.
7 / 5
Skeletal Vanguard [B]
Creature - Zombie Samurai
If Skeletal Vanguard is in your graveyard, you may pay B to return it to the battlefield. It gains gets +1/+1 until end of turn.
1 / 1
Guild Nightstalker [B1]
Creature - Human Samurai
When Guild Nightstalker blocks, it becomes Indestructible until end of turn.
If R was spent to cast Guild Nightstalker, you may put a +1/+1 counter on it.
2 / 1
Warblood Servant [3B]
Creature - Barbarian Zombie
Whenever Warblood Servant attacks, if damage would be dealt to it, prevent that damage.
3/3
Mind Force [1BB]
Instant
Each Attacking Creature gets -2/-2 until end of turn.
Necroprice [5BB]
Sorcery
All creatures get +2/+2 and deathtouch until end of turn, regenerate each creature you control.
Feverbrain Enforcer [3BB]
Creature - Zombie Mercenary
BB: Feverbrain Enforcer gets +2/+0 and gains trample until end of turn.
4 / 4
Wastewalker [3B]
Creature - Vampire Spirit
Flying, Lifelink
2 / 2
Void Eater [1B]
Creature - Snake Horror
Elemental creatures you control get +2/+2.
1 / 2
Rise of the Damned []
Enchantment
BB: Target non-creature permanent becomes a 1/1 Zombie creature until end of turn.
Madfensive Djinn (UU)
Creature – Elemental
Flying
When Madfensive Djinn dies, return all lands you control to their owner's hand.
5/3
Barbed Mage (1UU)
Creaure – Human Wizard
RR: Target creature gets +1/+1 and gains first strike until end of turn.
1 / 3
Mindpulse Squall (3UU)
Creature – Bird
Flying, First Strike
UU: Reveal your hand, Mindpulse Squall gains +1/+1 until end of turn for each instant or sorcery card revealed this way.
2 / 2
Huntling Rowler ( 4UU)
Creature - Shapeshifter
UU: You may reveal the top card of your library. If its a land card, Huntling Rowler gains Mountainwalk, Forestwalk, Swampwalk, and Trample until end of turn. If it is a human, target player sacrifices a creature.
3 / 3
Sarcal, the Angelic Explorer (7UU)
Legendary Creature – Island Shaman
Delve (Each card you exile from your graveyard while casting this spell pays for 1)
Creatures you control have Flying.
UU: Choose a color, each other creature with flying gains protection from the chosen color until end of turn.
3 / 4
Fated Voyager (1UU)
Creature – Human Artificer
Fated Voyager enters the battlefield with a +1/+1 counter on it.
T, Remove a +1/+1 counter from Fated Voyager: Reveal the top card of your library, if it is a land, place place two +1/+1 counters on Fated Voyager; if it is an Instant or Sorcery, prevent all damage that would be dealt to target creature or player this turn; if it is creature, gain control of target creature an opponent controls that shares a creature type with it.
2 / 1
Mifasu's Sphere (UUUU)
Sorcery
Suspend 4-U (Rather than cast this card from your hand, pay U and exile it with four time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.)
Each player selects one land and one non-land permanent they control and shuffle all other cards from the battlefield into their libraries.
Havok Apprenticeship (2UU)
Enchantment - Aura
At the beginning of you upkeep, attach Havok Apprenticeship to target permanent you control.
If enchanted permanent is a land, it becomes a 2/2 spirit creature, it is still a land; if it is an artifact, it becomes a 1/1 dragon creature with flying in addition to its other types; if it is an enchantment, it becomes a 1/1 legendary wizard enchantment creature, then place four +1/+1 counters on it.
Skyblight (1UU)
Instant
Creatures get -X/-0 until end of turn, where X is the number of blue creature cards in all graveyards.
Hazen, Mystic Guardian (3U)
Legendary Creature - Human Wizard
U: Target creature gets -1/0 until end of turn.
1U: Uncast target spell unless its controller pays 1.
2 / 2
Seal Scorcher (3U)
Creature - Fish
Seal Scorcher enters the battlefield with a +1/+1 counter on it for each mountain you control.
1 / 1
Memory Familiar (U)
Creature - Spirit
U: Look at the top five cards of your library.
0 / 1
Dark Skyrider (3U)
Creature - Fish
Flying
R: Dark Scarrider gains +1/+0 until end of turn.
Nephalia's Might (UU)
Enchantment - Enchant Artifact
Enchanted Artifact gets "Tap: Target creature you control gets +4/-4 until end of turn."
Chimeric Distortion [UU]
Instant
Target non-blue creature gets +2/+2 and gains first strike until end of turn.
Signog, Downkin Mentor [2U]
Legendary Creature - Merfolk Wizard
U: Target creature gets +X/+0 until end of turn, where X is Signog, Downkin Mentor 's power.
1 / 1
Whispered Souls [1UU]
Creature - Spirit
Hexproof, Flash
When @ enters the battlefield, return target sorcery card from your graveyard to your hand.
0/2
Dream Burdens [3U]
Enchantment
Cumulative Upkeep U
Whenever a player draws a card, that player discards a card.
Sandbar Scout [U]
Creature - Merfolk Warrior
Doublestrike
At the beginning of your upkeep, sacrifice Sandbar Scout unless you sacrifice 1 land.
2 / 2
Scroll Pact (2UU)
Sorcery
Discard your hand.
Search your library for up to two cards, put them in your hand, then shuffle your library.
Shadow-Water Striker [3U]
Creature - Fish
Whenever Shadow-Water Striker deals damage, you gain that much life.
Islands you control gain first strike.
2 / 3
Seablood [4U]
Creature - Elemental
Flying
4 / 2
(1WW)
Enchantment Aura – Enchant Creature
Whenever enchanted creature deals damage, you may gain 1 life for each land you control.
Knell of Rockrad (2W)
Creature – Human Warrior
3: Knell of Rockrad gets +1/+1 until end of turn for each plains you control.
1 / 2
Diabolic Spirit (2W)
Creature - Spirit
Flying
When Diabolic Spirit comes enters the battlefield, put a 3/3 black Zombie creature token onto the battlefield.
1B: Target black creature gains +1/+1 until end of turn.
1/1
Titania Pridebearer (3WW)
Creature – Human Cleric
Whenever a creature you control is put into a graveyard from the battlefield, you may return a nonland permanent from your graveyard to your hand.
1 / 1
Targin Sacred Funeral (2W)
Sorcery
Target white creature gains +1/+1 until end of turn.
At the beginning of your upkeep, if Targin Sacred Funeral is in your graveyard, prevent all combat damage that would be dealt to target creature this urn.
Murit of the Dead (3W)
Creature – Zombie Artificer
1W: Put a +1/+1 counter on target artifact, creature, or land. It becomes a 1/1 zombie creature in addition to its other types until end of turn.
1 / 1
Trompling Giant (3WW)
Vigilance, Trample
Other white creature you control do not untap during their controllers' untap steps.
4 / 5
Opal Ward (1W)
Instant
Target creature gets -6/-0 until end of turn.
Battle Spoils [3W]
Instant
Remove target tapped creature from combat and exile it, then return it to the battlefield tapped.
Morbid: That creature does not untap during its owners next upkeep if a creature died this turn.
Croves, Time Thrasher [2WW]
Legendary Creature - Kor Soldier
Flash, Trample
When Croves, Time Thrasher attacks, put a 1/1 white soldier creature token onto the battlefield tapped and attacking.
Fading 2 (this creature enter the battlefield with 2 fade counters on it. At the beginning of your upkeep, remove a fade country from it. If you can't, sacrifice it.)
3 / 5
Sunscale Gambit [1W]
Instant
Target blocked creature gains protection from a color of your choice until end of turn, then place a +1/+1 counter on it for each Enchantment you control.
Celestial Incite [3W]
Search your library for a land card and put that card onto the battlefield. Then each player exiles his or her hand and puts any permanents exiled this way onto the battlefield tapped.
Rebel Wish [1W]
Instant
Creatures you control get +0/+3 and gain Flying until end of turn.
Battlefall [1W]
Enchantment - Aura
Whenever a player casts a spell, if you control a plains you may gain 2 life.
Pay 2 life for each plains you control: put a creature from your hand onto the battlefield, tapped.
Spirit of the Dragon [4W]
Legendary Creature - Spirit
Flying
Whenever Spirit of the Dragon deals combat damage to a player, put two +1/+1 counters on it, then target opponent loses 3 life.
2 / 5
Mystic Devastation [1WW]
Sorcery
Target player reveals the top card of their library, then each player sacrifices all permanents with converted mana cost equal to the revealed card.
Near-Death Crusader [2WW]
Fading 2:
6 / 2
Wall of Denium [3WW]
Legendary Creature - Wall
1WW: Regenerate Wall of Denium
Wall of Denium may block any number of creatures.
0/8
Deathless Keeper [4W]
Creature - Human Knight
First Strike
Whenever you cast a spell, if Deathless Keeper is in your graveyard you may return it to the battlefield tapped.
4 / 4
Trench Assassin (GG)
Creature – Human Druid
Tap: Return Trench Assassin and target creature you don't control to their owner's hand.
1 / 2
Ambush Archer GG
Creature – Elf
Flash
When Ambush Archer enters the battlefield, it deals 2 damage to target attacking creature.
1 / 1
Storm Forged (1GG)
Creature – Spirit Forest Warrior
At the beginning of your upkeep, add a +1/+1 counter to Storm Forged.
Remove a +1/+1 counter: Add 1 mana of any color to your mana pool
2 / 2
Ardget of Treefolk (1G)
Creature – Elf Advisor
When Ardget of Treefolk enters the battlefield, draw a card.
Tap an untapped creature you control: Untap target forest.
1 / 2
Scapo's Druids (3G)
Creature – Rat Shaman
BG: Target creature gets -X/-X until end of turn where X is equal to the number of black creatures you control.
3 / 1
Chant of the Portal Breaker (3G)
Reveal your hand, target opponent puts a card from your hand onto the battlefield under their control. Choose a color, then return all creatures of the chosen color from your graveyard onto the battlefield.
Shambling Bear (GGG)
Legendary Creature - Elf Wizard
GG: Regenerate target creature.
T: Target land becomes an X/X Elemental Beast creature with trample until end of turn where X is equal to the number of forests you control, it is still a land.
1 / 1
Snakeboon [1G]
Creature - Snake
Whenever Snakeboon becomes blocked, you may gain 3 life.
1 / 1
Wanderer of Islarren [4GG]
Legendary Creature - Human Druid
Whenever another permanent you control attacks, if it's a land, it gets +4/+4 until end of turn.
3 / 5
Distortion Growth [1G]
Creature - Ooze
When Distortion Growth enters the battlefield, if R was spent to cast Distortion Growth, you may choose a red instant or sorcery card from your graveyard and return it to your hand.
1 / 1
Sunscale Lurker [4GG]
Creature - Wurm
Trample
7 / 5
Slaughter Vines [1G]
Creature - Elemental
When Slaughter Vines enters the battlefield, you may draw a card at the beginning of the next end step.
1G, Tap: Target creature gets +2/+1 until end of turn.
1 / 1
Hanoma Companion [2G]
Creature - Wolf
At the beginning of your upkeep, if you control two or more mountains, return Hanoma Companion from your graveyard to your hand.
3 / 3
Treacherous Dreams [1G]
Enchantment - Aura
Enchant Creature
Enchanted creature gets -2/-0 and can't block.
Cobweb Scourge [1G]
Creature - Elf Warrior
When Cobweb Scourge attacks, you may tap target creature, it doesn't untap during its controller's next untap step.
1 / 2
Deep Shade [1G]
Creature - Beast
Deep Shade cannot be blocked by creatures.
2 / 1
Irondrag Fanatic (3RR)
Creature - Minotaur
When Irondrag Fanatic enters the battlefied, put a +1/+1 counter on each other creature you control. When Irondrag Fanatic dies, if you control four or more creatures with a +1/+1 counter, return it to the battlefield.
1/3
Elves Avenger (2RR)
Creature – Human Warrior
Creatures with power 3 or less cannot deal combat damage to you.
Whenever a creature is dealt damage by a green creature, that creature gets +1/+1 until end of turn.
2 / 2
Cavalier Caromancer (2R)
Creature – Goblin Wizard
Haste
Whenever Cavalier Caromancer or a permanent enters the battlefield, its controller sacrifices it unless its controller pays (2).
2 / 1
Powder Firespark (3RR)
Creature - Goblin
When Powder Firespark enters the battlefield, tap all lands.
Sacrifice Powder Firespark: destroy target tapped land.
1 / 1
Domain (1RR)
Sorcery
Return target creature card from your graveyard to your hand.
Restless Mano (2R)
Creature – Satyr Shaman
RR: Put a +1/+1 counter on target creature, it gains defender until end of turn.
Sacrifice Restless Mano: Untap target tapped creature an opponent controls and gain life equal to its toughness.
2 / 2
Monolith of War (3R)
Enchantment – Enchant Mountain
Spells you cast cost 1 less to cast.
Goblin Unchangeling
Creature - Goblin Warrior
R1: Target creature you control gets +1/+1 until end of turn unless an opponent pays 1.
2 / 2
Zabeshi Archer (4R)
Creature - Human Berserker
Whenever Zabeshi Archer attacks or blocks, it deals 2 damage divided as you choose among any number of creature and/or players.
3 / 3
Berserk Escape (1R)
Instant
As an additional cost to cast Berserk Escape, sacrifice a mountain.
Target blocked creature gets +5/+0 and has first strike.
Curse of Wildrun (1RR)
Instant
Choose one
- Prevent all combat damage that would be dealt to blocked creatures this turn.
- Target creature gets -3/-3 until end of turn for each creature blocking it.
Gloryblaster Goblin (1RR)
Creature - Goblin
Haste
When Gloryblaster Goblin deals combat damage to a player, destroy target land then sacrifice Gloryblaster Goblin.
2 / 1
Salchan ,General of Riftsaan [4RR]
Legendary Creature - Rhino
Indestructable
Salchan ,General of Riftsaan can block any number of creatures with power 2 or less.
R: Target creature gets +1/+0 until end of turn.
4 / 3
Bandit Minion [1R]
Creature - Hound
Whenever a goblin attacks, it can't be blocked this turn.
2 / 1
Slaughter Elf [1R]
Creature - Elf
Haste
1 / 2
Sakamaster Strike [1RR]
Instant
Counter target spell unless its controller pays 2 life.
Blithering Scout [R1]
Creature - Goblin
Blithering Scout gets +1/+1 as long as there are no +1/+1 counters on creatures you control.
Blithering Scout can't attack or block unless its controller pays [2].
2 / 2
Pyre of Souls [3RR]
Return target creature with converted mana cost 4 or less from your graveyard to the battlefield.
Deathless Fire [1R]
Creature - Elemental
1W: Deathless Fire gets +1/+1 and has lifelink until end of turn.
1 / 2
Judgement of Grag [R]
Enchantment - Aura
Enchant Creature
As an additional cost to cast Judgement of Grag, sacrifice a creature.
Whenever enchanted creature deals combat damage, place a +1/+1 counter on it.
Slayerwind [1R]
Creature - Human Warrior
Haste
When Slayerwind enters the battlefield, choose a color. Slayerwind gets +1/+0 for each creature your opponents control of chosen color until end of turn.
2 / 1
Thunderscale Drake [6R]
Creature - Dragon
Flying
When Thunderscale Drake enters the battlefield, destroy target creature. Thunderscale Drake deals 3 damage to that creature's controller.
4 / 4
Burnbringer [4RR]
Creature - Orc Shaman
4, Sacrifice Burnbringer: target player loses 5 life.
5 / 1
Glory of the Brass Dawn [5R]
Sorcery
Glory of the Brass Dawn can't be countered.
Destroy all permanents. At the beginning of your next upkeep, you may return a non-basic land from your graveyard to the battlefield.
Wail of Mercy [2R]
Enchantment
Whenever a token creature enters the battlefield, exile it.
Fury Seeker [2RR]
Creature - Elemental
Flying, Linklink
2R: Target creature gets +1/+1 and gains first strike until end of turn.
2 / 3
Flamestone Lifebringer [2R]
Creature - Elemental Shaman
At the beginning of your upkeep, put a +1/+1 counter on target land. It becomes a 1/1 creature, it is still a land.
2 / 2
Reading StackOverflow on related errors makes me a little leery of following its advice, but I'm not sure what else I would do. On further investigation, I'm not even sure where this code is.
Wait, what is this? And are you using ROSE? I'm a contributor to that project. Sawyer is an event logger. As to why there is an error, I'd have to investigate.
EDIT: By the way, LASture, I love the cards. They're a nice mix of hilarious and awesome.
EDIT(2): Oh lord, this new hardware is unbelievably fast. I train a three-layer LSTM network with 512 units per layer, sequence length of 200, and batch size of 100, at a speed of 1.36 seconds per batch. In other words, I can fully train a network to generate Magic cards in under two hours as opposed to, say, 20-26 hours. That is.. wow. That is fast. Wow. I'll have to play with that later.
My LinkedIn profile... thing (I have one of those now!).
My research team's webpage.
The mtg-rnn repo and the mtg-encode repo.
I will make small edits to a card that's nearly there, such as removing a spurious clause added to the end of an otherwise rules-legal sentence, defining an undefined token type, or replacing "Echo" with "Kicker" in a card that has an "if it was kicked" clause. But I haven't figured out where I fall on adjusting mana costs.
That's awesome stuff... will it be as quick when you try the StackRNN implementation? I'm guessing a 1080p Starry Night Jace is also within reach too?
Is it just the powerful GPU making the training so fast (presumably you're training using the GPU) or are the 20 CPU cores also helping?