├── Makefile ├── PvP.txt ├── PvPx.txt ├── PvT.txt ├── PvTx.txt ├── PvZ.txt ├── PvZx.txt ├── README.markdown ├── TODO.markdown ├── TvP.txt ├── TvPx.txt ├── TvT.txt ├── TvTx.txt ├── TvZ.txt ├── TvZx.txt ├── ZvP.txt ├── ZvPx.txt ├── ZvT.txt ├── ZvTx.txt ├── ZvZ.txt ├── ZvZx.txt ├── arff.py ├── clustering ├── README ├── annotate.py ├── clustering.py ├── count_all.sh ├── count_unknown.sh ├── count_unknown_orig.sh ├── latex_table.py ├── launch_labeling.sh ├── myscmPvP_Protoss_Mid.arff ├── myscmPvT_Protoss_Mid.arff ├── myscmPvT_Terran_Mid.arff ├── myscmPvZ_Protoss_Mid.arff ├── myscmPvZ_Zerg_Mid.arff ├── myscmTvT_Terran_Mid.arff ├── myscmTvZ_Terran_Mid.arff ├── myscmTvZ_Zerg_Mid.arff ├── myscmZvZ_Zerg_Mid.arff ├── scmPvP_Protoss_Mid.arff ├── scmPvT_Protoss_Mid.arff ├── scmPvT_Terran_Mid.arff ├── scmPvZ_Protoss_Mid.arff ├── scmPvZ_Zerg_Mid.arff ├── scmTvT_Terran_Mid.arff ├── scmTvZ_Terran_Mid.arff ├── scmTvZ_Zerg_Mid.arff └── scmZvZ_Zerg_Mid.arff ├── count_min.py ├── enums_name_tables.h ├── enums_name_tables_tt.h ├── full.txt ├── fullx.txt ├── lPall.txt ├── lPallx.txt ├── lPvP.txt ├── lPvPx.txt ├── lPvT.txt ├── lPvTx.txt ├── lPvZ.txt ├── lPvZx.txt ├── lTall.txt ├── lTallx.txt ├── lTvP.txt ├── lTvPx.txt ├── lTvT.txt ├── lTvTx.txt ├── lTvZ.txt ├── lTvZx.txt ├── lZall.txt ├── lZallx.txt ├── lZvP.txt ├── lZvPx.txt ├── lZvT.txt ├── lZvTx.txt ├── lZvZ.txt ├── lZvZx.txt ├── model.cpp ├── model.h ├── model.pdf ├── noisy.sh ├── parameters.h ├── plot_all_Time_per_Opening_and_X.sh ├── replays.h ├── scrapers ├── GG_rep_dler.sh └── TL_rep_dler.py ├── scripts ├── cut.py ├── cut_mines.sh ├── divise.py ├── noisify.py ├── noisify.sh ├── plot_noise_evolution.py ├── transmute.py └── transmute.sh ├── tPvP.txt ├── tPvPx.txt ├── tPvT.txt ├── tPvTx.txt ├── tPvZ.txt ├── tPvZx.txt ├── tTvP.txt ├── tTvPx.txt ├── tTvT.txt ├── tTvTx.txt ├── tTvZ.txt ├── tTvZx.txt ├── tZvP.txt ├── tZvPx.txt ├── tZvT.txt ├── tZvTx.txt ├── tZvZ.txt ├── tZvZx.txt ├── techtrees.cpp ├── techtrees.h ├── test_functional_dirac.cpp ├── test_getBuildings.cpp ├── test_getOpeningVal.cpp ├── test_lambda.cpp ├── test_learning.cpp ├── test_x_values.cpp ├── tests ├── lPvPPP └── tPvPPP ├── update_model.pdf ├── x_values.h └── x_values_tt.h /Makefile: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | PROBT_INCLUDE=/Users/gabrielsynnaeve/these/code/probt22/include 4 | PROBT_LIB=/Users/gabrielsynnaeve/these/code/probt22/lib 5 | BOOST_STAGE_LIB=/Users/gabrielsynnaeve/labs/boost_1_45_0/stage/lib 6 | BOOST_INCLUDE=/Users/gabrielsynnaeve/labs/boost_1_45_0 7 | 8 | model: model.cpp 9 | g++ -ggdb -arch i386 -I$(PROBT_INCLUDE) model.cpp -L$(PROBT_LIB) -lpl -o model 10 | 11 | model_with_serialization: model.cpp 12 | g++ -ggdb -arch i386 -D__SERIALIZE__ -I$(BOOST_INCLUDE) -I$(PROBT_INCLUDE) model.cpp -L$(BOOST_STAGE_LIB) -L$(PROBT_LIB) -lpl -lboost_serialization -o model 13 | 14 | techtrees: techtrees.cpp 15 | g++ -ggdb -arch i386 -DTECH_TREES -I$(PROBT_INCLUDE) techtrees.cpp -L$(PROBT_LIB) -lpl -o techtrees 16 | 17 | tt: model.cpp 18 | g++ -ggdb -arch i386 -DTECH_TREES -I$(PROBT_INCLUDE) model.cpp -L$(PROBT_LIB) -lpl -o tt 19 | 20 | tests: test_x_values.cpp test_functional_dirac.cpp test_lambda.cpp test_getOpeningVal.cpp test_getBuildings.cpp 21 | g++ -ggdb test_x_values.cpp -o test_x_values 22 | g++ -arch i386 -I$(PROBT_INCLUDE) test_functional_dirac.cpp \ 23 | -L$(PROBT_LIB) -lpl -o test_functional_dirac 24 | g++ -arch i386 -I$(PROBT_INCLUDE) test_lambda.cpp \ 25 | -L$(PROBT_LIB) -lpl -o test_lambda 26 | g++ -arch i386 -I$(PROBT_INCLUDE) test_learning.cpp \ 27 | -L$(PROBT_LIB) -lpl -o test_learning 28 | g++ -ggdb test_getOpeningVal.cpp -o test_getOpeningVal 29 | g++ -ggdb test_getBuildings.cpp -o test_getBuildings 30 | 31 | all: tests model tt 32 | #techtrees 33 | make run 34 | [ -x /usr/bin/say ] && say "Battlecruiser operational!" 35 | 36 | run: 37 | DYLD_LIBRARY_PATH=$(PROBT_LIB):$(DYLD_LIBRARY_PATH) ./model lPvP.txt tPvP.txt 38 | echo $(PROBT_LIB) 39 | 40 | run_tt: 41 | DYLD_LIBRARY_PATH=$(PROBT_LIB):$(DYLD_LIBRARY_PATH) ./tt lPvP.txt tPvP.txt 42 | 43 | run_with_serialization: 44 | DYLD_LIBRARY_PATH=$(BOOST_STAGE_LIB):$(PROBT_LIB):$(DYLD_LIBRARY_PATH) ./model lPvP.txt tPvP.txt 45 | echo $(BOOST_STAGE_LIB) 46 | echo $(PROBT_LIB) 47 | 48 | debugrun: 49 | DYLD_LIBRARY_PATH=$(PROBT_LIB):$(DYLD_LIBRARY_PATH) gdb ./model < PvP.txt 50 | echo $(PROBT_LIB) 51 | 52 | mymodel: model.cpp 53 | g++ -ggdb -arch i386 -DMY_OPENINGS_LABELS -I$(PROBT_INCLUDE) model.cpp -L$(PROBT_LIB) -lpl -o mymodel 54 | 55 | mymodel_with_serialization: model.cpp 56 | g++ -ggdb -arch i386 -D__SERIALIZE__ -DMY_OPENINGS_LABELS -I$(BOOST_INCLUDE) -I$(PROBT_INCLUDE) model.cpp -L$(BOOST_STAGE_LIB) -L$(PROBT_LIB) -lpl -lboost_serialization -o mymodel 57 | 58 | test_x_values: tests 59 | ./test_x_values 60 | 61 | test_functional_dirac: tests 62 | DYLD_LIBRARY_PATH=$(PROBT_LIB):$(DYLD_LIBRARY_PATH) ./test_functional_dirac 63 | 64 | test_lambda: tests 65 | DYLD_LIBRARY_PATH=$(PROBT_LIB):$(DYLD_LIBRARY_PATH) ./test_lambda 66 | 67 | test_learning: tests 68 | DYLD_LIBRARY_PATH=$(PROBT_LIB):$(DYLD_LIBRARY_PATH) ./test_learning 69 | sed -i '' 's#set data style lines#set style data lines#' *.gnuplot 70 | gnuplot *.gnuplot 71 | 72 | gnuplot_format: 73 | sed -i '' 's#set data style lines#set style data lines#' *.gnuplot 74 | sed -i '' 's#X#TechTree#' *.gnuplot 75 | sed -i '' 's#plTabulatedDistribution#P#' *.gnuplot 76 | for file in `ls *.gnuplot`; do echo 'set terminal aqua font "sans,12"' | cat - $$file > /tmp/out && mv /tmp/out $$file ; done 77 | 78 | gnuplot_heatmap: gnuplot_format 79 | sed -i '' 's#set style data lines#set pm3d map#' *.gnuplot 80 | 81 | gnuplot_bw_log_heatmap: gnuplot_heatmap 82 | for file in `ls *.gnuplot`; do echo 'set palette gray negative' | cat - $$file > /tmp/out && mv /tmp/out $$file ; done 83 | for file in `ls *.gnuplot`; do echo 'set logscale zcb' | cat - $$file > /tmp/out && mv /tmp/out $$file ; done 84 | 85 | test_getOpeningVal: tests 86 | ./test_getOpeningVal < lPall.txt 87 | 88 | test_getBuildings: tests 89 | ./test_getBuildings < lPall.txt | less 90 | 91 | runtests: test_x_values test_functional_dirac test_lambda test_getOpeningVal test_getBuildings 92 | 93 | fullbenchs: model mymodel 94 | DYLD_LIBRARY_PATH=$(PROBT_LIB):$(DYLD_LIBRARY_PATH) 95 | echo "TODO" 96 | 97 | benchs: model mymodel 98 | DYLD_LIBRARY_PATH=$(PROBT_LIB):$(DYLD_LIBRARY_PATH) 99 | echo "Benchmarks with Ben Weber labels:\n" > benchs.txt 100 | for name in [TPZ]v[TPZ].txt; do echo "$${name%.*}" >> benchs.txt &&\ 101 | DYLD_LIBRARY_PATH=$(PROBT_LIB):$(DYLD_LIBRARY_PATH) ./model l$$name t$$name | grep ">>> Positive classif" >> benchs.txt\ 102 | && echo "\n" >> benchs.txt; done 103 | echo "Benchmarks with my labels:\n" >> benchs.txt 104 | for name in [TPZ]v[TPZ]x.txt; do echo "$${name%.*}" >> benchs.txt &&\ 105 | DYLD_LIBRARY_PATH=$(PROBT_LIB):$(DYLD_LIBRARY_PATH) ./mymodel l$$name t$$name | grep ">>> Positive classif" >> benchs.txt\ 106 | && echo "\n" >> benchs.txt; done 107 | 108 | noisebenchs: 109 | DYLD_LIBRARY_PATH=$(PROBT_LIB):$(DYLD_LIBRARY_PATH) 110 | for ((i=1; i<16; i++)); do \ 111 | ./noisy.sh $$i >> benchs.txt; done 112 | 113 | ttbenchs: tt 114 | DYLD_LIBRARY_PATH=$(PROBT_LIB):$(DYLD_LIBRARY_PATH) 115 | echo "Launching benchmarks:\n" > ttbenchs.txt 116 | for name in [TPZ]v[TPZ].txt; do echo "$${name%.*}" >> ttbenchs.txt &&\ 117 | ./tt l$$name t$$name | grep ">>>" >> ttbenchs.txt\ 118 | && echo "\n" >> ttbenchs.txt; done 119 | 120 | learn_all: model_with_serialization mymodel_with_serialization 121 | DYLD_LIBRARY_PATH=$(BOOST_STAGE_LIB):$(PROBT_LIB):$(DYLD_LIBRARY_PATH) 122 | for name in [TPZ]v[TPZ].txt; do echo $$name && ./model $$name; done 123 | for name in [TPZ]v[TPZ]x.txt; do echo $$name && ./mymodel $$name; done 124 | 125 | .PHONY: model mymodel tests techtrees tt 126 | 127 | clean: 128 | rm -rf ./-* ./:* ./[* prefix option illegal mktemp: c++-header *~ \ 129 | *.dSYM \ 130 | *.gnuplot* \ 131 | *.fig \ 132 | test_x_values test_getOpeningVal test_getBuildings \ 133 | test_functional_dirac test_lambda test_learning\ 134 | protoss_possible_tech_trees.txt \ 135 | terran_possible_tech_trees.txt \ 136 | zerg_possible_tech_trees.txt \ 137 | model tt techtrees\ 138 | t*n*.txt \ 139 | x_values 140 | 141 | -------------------------------------------------------------------------------- /README.markdown: -------------------------------------------------------------------------------- 1 | # Opening/BuildTree prediction for StarCraft: Broodwar 2 | 3 | ### Dependency: 4 | [ProBT](http://probayes.com/index.php?option=com_content&view=article&id=83&Itemid=88&lang=en) 5 | [Boost.serialization](http://www.boost.org/doc/libs/1_45_0/libs/serialization/doc/index.html) (optional, note: compiled with `./bjam --with-serialization --build-type=complete --layout=versioned toolset=darwin architecture=x86 address-model=32`) 6 | 7 | ### Input format: 8 | One replay/game per line, lines such as 9 | First_Building_Name Time_Built; Second_Building_Name Time_Built2; 10 | 11 | See the \*v\*.txt files 12 | 13 | ### It does: 14 | 15 | 1. Learn the possible tech trees (X) from replays (or you can generate them) 16 | 2. Learn the distributions of P(Time | X, Opening) and P(X | Opening) 17 | 3. Learn the distributions of P(Time | BuildTree) with TECH\_TREES switched on 18 | 4. Infer P(Opening | Observations, Time) 19 | 20 | See *model.pdf* or [CIG'11 publication](http://dl.dropbox.com/u/14035465/OpeningPrediction.pdf) for 1,2,4 and [AIIDE'11 publication](http://dl.dropbox.com/u/14035465/AIIDE_11_RC1.pdf) for 3. 21 | 22 | ### Workflow: 23 | 24 | 1. (Optional, our labels) Clusterize from clustering/launch\_labeling.sh 25 | 2. Transform (transmute) arff files into txt files with scripts/transmute.sh 26 | 3. To perform evaluations, cut the txt files into learn and test files with the scripts/cut\* scripts 27 | 4. Compile (make) and test either with make targets or `export (DY)LD_LIBRARY_PATH= && ./model lXvX.txt tXvX.txt` 28 | 29 | ### More is more: 30 | 31 | You will always need one runtime library: probt (probt22 in Makefile, any probt >= 2.2 should do). 32 | depending on how it was compiled, the main of model.cpp (*model* (Ben Weber openings), *mymodel* (my openings, c.f. clustering/), or *tt* (tech trees only) in the Makefile) will learn and exit from file (match-up) XvY.txt if given: 33 | 34 | ./model XvY.txt 35 | 36 | or will learn on XvY and test on WvZ if given: 37 | 38 | ./model XvY.txt WvZ.txt 39 | 40 | Example: 41 | 42 | ./model lZvT.txt tZvT.txt 43 | 44 | The prediction will always be against X or W, for instance in ZvT, the predictions will be as a Terran player against a Zerg one (the learning is also of Zerg build/tech trees and openings). 45 | 46 | 1. To just compile and run the Opening prediction model with Ben Weber's openings labels: 47 | 48 | make model 49 | make run OR (with appropriate DYLD_LIBRARY_PATH) ./model XvT.txt [WvZ.txt] 50 | 51 | 2. To compile and run the Opening prediction model with Ben's openings labels and serialization, you need to be able to link to a boost >= 1.45 serialization dylib/dll/so: 52 | 53 | make model_with_serialization 54 | make run_with_serialization OR (with appropriate DYLD_LIBRARY_PATH) ./model XvT.txt [WvZ.txt] 55 | ex here: ./model PvT.txt 56 | 57 | 3. The same with my openings (c.f. clustering/clustering.py): 58 | 59 | make mymodel[_with_serialization] 60 | make run[_with_serialization] OR (with appropriate DYLD_LIBRARY_PATH) ./mymodel XvY.txt [WvZ.txt] 61 | ex here: ./mymodel PvTx.txt 62 | 63 | 4. To compile and run the (build/)tech trees prediction only: 64 | 65 | make tt 66 | make run_tt OR (with appropriate DYLD_LIBRARY_PATH) ./tt XvY.txt [WvZ.txt] 67 | ex here: ./tt PvT.txt 68 | 69 | 5. A lot of plotting options, see Makefile 70 | -------------------------------------------------------------------------------- /TODO.markdown: -------------------------------------------------------------------------------- 1 | (See AIIDE 2011 submission: ) Try and move the model towards P(X|Obs) for late game, with a distance between Xes. 2 | 3 | Use __absence__ of Observation(s) as an information. For instance: __if__ he did __not__ attack at time T1, __then__ he is __not__ doing these Openings so these other Openings are more likely to happen. 4 | 5 | Use a *log-like* scale for time (instead of linear/uniform) that increases with the *divergence speed* (in the space of possible states/strategies) of StarCraft. 6 | -------------------------------------------------------------------------------- /arff.py: -------------------------------------------------------------------------------- 1 | #!/opt/local/bin/python 2 | import sys 3 | 4 | """ 5 | Copyright 2011 Gabriel Synnaeve 6 | License: Python Software Foundation License (PSFL, BSD-like, GPL compatible) 7 | http://docs.python.org/license.html 8 | 9 | Transforms lord martin replay rips (one big file format) into: 10 | - one arff file: attributes are buildings/units/upgrades for the 2 players 11 | 1 line = 1 game 12 | - one text file: one line for one player's action in 13 | "Race_Building/UnitUpgrade Time;" format, 2 lines = 1 game 14 | 15 | Winner/Loser = -1 is for unspecified/unfound/draw, 16 | 0/1 player number (incremental) for arff format 17 | 0/1 false/true for txt format 18 | 19 | Options: 20 | --generate-attributes only outputs attributes (buildings/upgrades/units) 21 | --multiple-buildings use second/third/fourth for some buildings... 22 | --generate-text output in txt (and not arff) format 23 | """ 24 | 25 | # pyt arff.py all.lmr [--generate-attributes] [--multiple-buildings]" 26 | def usage(): 27 | print "Usage is:" 28 | print "pyt arff.py FILE.lmr [--generate-attributes] [--multiple-buildings] [--generate-text]" 29 | 30 | if len(sys.argv) < 2: 31 | usage() 32 | 33 | write_arffs = True 34 | multiple_buildings = True # second (and more) Gateways/Barracks/Hatches... 35 | generate_attributes = False 36 | if '--generate-attributes' in sys.argv: 37 | generate_attributes = True 38 | if '--multiple-buildings' in sys.argv: 39 | multiple_buildings = True 40 | if '--generate-text' in sys.argv: 41 | write_arffs = False 42 | 43 | if write_arffs: 44 | pvp = open('2p'+sys.argv[1].split('.')[0]+'pvp.arff', 'w') 45 | pvt = open('2p'+sys.argv[1].split('.')[0]+'pvt.arff', 'w') 46 | pvz = open('2p'+sys.argv[1].split('.')[0]+'pvz.arff', 'w') 47 | tvt = open('2p'+sys.argv[1].split('.')[0]+'tvt.arff', 'w') 48 | tvz = open('2p'+sys.argv[1].split('.')[0]+'tvz.arff', 'w') 49 | zvz = open('2p'+sys.argv[1].split('.')[0]+'zvz.arff', 'w') 50 | else: 51 | pvp = open('2p'+sys.argv[1].split('.')[0]+'pvp.txt', 'w') 52 | pvt = open('2p'+sys.argv[1].split('.')[0]+'pvt.txt', 'w') 53 | pvz = open('2p'+sys.argv[1].split('.')[0]+'pvz.txt', 'w') 54 | tvt = open('2p'+sys.argv[1].split('.')[0]+'tvt.txt', 'w') 55 | tvz = open('2p'+sys.argv[1].split('.')[0]+'tvz.txt', 'w') 56 | zvz = open('2p'+sys.argv[1].split('.')[0]+'zvz.txt', 'w') 57 | 58 | 59 | s = set() 60 | protoss = set() 61 | terran = set() 62 | zerg = set() 63 | 64 | p = [{'game':{}}, {'game':{}}, -1] 65 | nbp = 0 66 | 67 | def extract_attribute(t): 68 | """ 69 | Extract the building/unit/upgrade name and append the Race_ in front 70 | Works with a closure on p (players list of dict) 71 | """ 72 | ret = t[len(t)-1] 73 | if 'player' in ret: # prune/filter player quit/disconnect 74 | return '' 75 | ret = ret.replace(' ', '_') 76 | if '(' in ret: 77 | ret = ret.split('(')[1].replace(')', '') 78 | ### Because upgrades sometimes are Protoss_Air_... 79 | if not 'Protoss_' in ret\ 80 | and not 'Terran_' in ret \ 81 | and not 'Zerg_' in ret: 82 | tr = p[int(t[2])]['race'] 83 | if tr == 'P': 84 | ret = 'Protoss_' + ret 85 | elif tr == 'T': 86 | ret = 'Terran_' + ret 87 | elif tr == 'Z': 88 | ret = 'Zerg_' + ret 89 | return ret 90 | 91 | def write_to(t): 92 | mu_ok = False 93 | for i in [0, 1]: 94 | if not mu_ok: 95 | if t[i]['race'] == 'P': 96 | p1 = i 97 | sp1 = protoss 98 | if t[1-i]['race'] == 'P': 99 | to_write = pvp 100 | p2 = 1-i 101 | sp2 = protoss 102 | mu_ok = True 103 | if t[1-i]['race'] == 'T': 104 | to_write = pvt 105 | p2 = 1-i 106 | sp2 = terran 107 | mu_ok = True 108 | if t[1-i]['race'] == 'Z': 109 | to_write = pvz 110 | p2 = 1-i 111 | sp2 = zerg 112 | mu_ok = True 113 | for i in [0, 1]: 114 | if not mu_ok: 115 | if t[i]['race'] == 'T': 116 | p1 = i 117 | sp1 = terran 118 | if t[1-i]['race'] == 'T': 119 | to_write = tvt 120 | p2 = 1-i 121 | sp2 = terran 122 | mu_ok = True 123 | if t[1-i]['race'] == 'Z': 124 | to_write = tvz 125 | p2 = 1-i 126 | sp2 = zerg 127 | mu_ok = True 128 | if not mu_ok: 129 | if t[0]['race'] == 'Z' and t[1]['race'] == 'Z': 130 | to_write = zvz 131 | p1 = 0 132 | p2 = 1 133 | sp1 = zerg 134 | sp2 = zerg 135 | mu_ok = True 136 | if write_arffs: 137 | if t[2] != -1: 138 | to_write.write(str(p1 - t[2])) 139 | else: # DRAW 140 | to_write.write('-1') 141 | for a in sp1: 142 | if a in t[p1]['game']: 143 | to_write.write(',' + t[p1]['game'][a]) 144 | else: 145 | to_write.write(',0') 146 | for a in sp2: 147 | if a in t[p2]['game']: 148 | to_write.write(',' + t[p2]['game'][a]) 149 | else: 150 | to_write.write(',0') 151 | to_write.write('\n') 152 | else: 153 | if 'winner' in t[p1]: 154 | to_write.write("Winner " + str(t[p1]['winner']) + '; ') 155 | else: 156 | to_write.write("Winner -1; ") 157 | for a in sp1: 158 | if a in t[p1]['game']: 159 | to_write.write(a + ' ' + str(t[p1]['game'][a]) + '; ') 160 | else: 161 | to_write.write(a + ' 0; ') 162 | to_write.write('\n') 163 | if 'winner' in t[p2]: 164 | to_write.write("Winner " + str(t[p2]['winner']) + '; ') 165 | else: 166 | to_write.write("Winner -1;") 167 | for a in sp2: 168 | if a in t[p2]['game']: 169 | to_write.write(a + ' ' + str(t[p2]['game'][a]) + '; ') 170 | else: 171 | to_write.write(a + ' 0; ') 172 | to_write.write('\n') 173 | 174 | for step in [0,1]: 175 | f = open(sys.argv[1], 'r') 176 | for line in f: 177 | if line[0] == '[': # new replay name, write the old 178 | if p[0]['game'] != {} or p[1]['game'] != {}: 179 | write_to(p) 180 | # re-init for next game/replay 181 | p = [{'game':{}}, {'game':{}}, -1] 182 | nbp = 0 183 | if line[0] in '0123456789': # players' actions 184 | if nbp != 2: 185 | pass # SKIP (we are only interested in duel / 1vs1) 186 | else: 187 | line = line.rstrip(' \n\r').split(',') 188 | tmp = extract_attribute(line) 189 | if tmp != '' and tmp not in s: 190 | s.add(tmp) 191 | if step == 1 : 192 | if 'player quit' in line[len(line) - 1]\ 193 | and not 'winner' in p[int(line[2])]: 194 | p[int(line[2])]['winner'] = 0 195 | p[1 - int(line[2])]['winner'] = 1 196 | p[2] = 1-int(line[2]) 197 | else: 198 | player = int(line[2]) 199 | if not tmp in p[player]['game']: 200 | p[player]['game'][tmp] = line[0] 201 | else: # search for Nexus2, Pylon2-3, Barracks2-4... 202 | for i in range(2,5): 203 | totest = tmp+str(i) 204 | if totest in s\ 205 | and totest not in p[player]['game']: 206 | p[player]['game'][totest] = line[0] 207 | break 208 | if line[0] == '_': # replay header 209 | if "Human" in line: 210 | nbp += 1 211 | tmp = line.strip('_').rstrip(' \n').split(',') 212 | if ('name' in p[0] and p[0]['name'] != ''): 213 | p[1]['name'] = tmp[0] 214 | p[1]['race'] = tmp[2] 215 | else: 216 | p[0]['name'] = tmp[0] 217 | p[0]['race'] = tmp[2] 218 | f.close() 219 | if multiple_buildings: 220 | s.add('Protoss_Gateway2') 221 | s.add('Protoss_Gateway3') 222 | s.add('Protoss_Gateway4') 223 | s.add('Protoss_Assimilator2') 224 | s.add('Protoss_Nexus2') 225 | s.add('Protoss_Nexus3') 226 | s.add('Protoss_Pylon2') 227 | s.add('Protoss_Pylon3') 228 | s.add('Terran_Supply_Depot2') 229 | s.add('Terran_Supply_Depot3') 230 | s.add('Terran_Command_Center2') 231 | s.add('Terran_Command_Center3') 232 | s.add('Terran_Barracks2') 233 | s.add('Terran_Barracks3') 234 | s.add('Terran_Barracks4') 235 | s.add('Terran_Refinery2') 236 | s.add('Zerg_Hatchery2') 237 | s.add('Zerg_Hatchery3') 238 | s.add('Zerg_Hatchery4') 239 | s.add('Zerg_Overlord2') 240 | s.add('Zerg_Overlord3') 241 | s.add('Zerg_Extractor2') 242 | if step == 0: 243 | for at in s: 244 | if 'Terran_' in at: 245 | terran.add(at) 246 | for at in s: 247 | if 'Zerg_' in at and at != 'Zerg_': # TODO small bug with "Zerg_" 248 | zerg.add(at) 249 | for at in s: 250 | # for mind control 251 | if 'Protoss_' in at\ 252 | and at.replace('Protoss_', 'Terran_') not in terran\ 253 | and at.replace('Protoss_', 'Zerg_') not in zerg: 254 | protoss.add(at) 255 | if generate_attributes: 256 | attr = open('attributes.txt', 'w') 257 | for at in protoss: 258 | attr.write(at + '\n') 259 | for at in terran: 260 | attr.write(at + '\n') 261 | for at in zerg: 262 | attr.write(at + '\n') 263 | break 264 | else: 265 | if write_arffs: # arff headers 266 | pvp.write('@RELATION Starcraft_PvP\n') 267 | pvt.write('@RELATION Starcraft_PvT\n') 268 | pvz.write('@RELATION Starcraft_PvZ\n') 269 | tvt.write('@RELATION Starcraft_TvT\n') 270 | tvz.write('@RELATION Starcraft_TvZ\n') 271 | zvz.write('@RELATION Starcraft_ZvZ\n') 272 | pvp.write('\n@ATTRIBUTE Winner INTEGER\n') 273 | pvt.write('\n@ATTRIBUTE Winner INTEGER\n') 274 | pvz.write('\n@ATTRIBUTE Winner INTEGER\n') 275 | tvt.write('\n@ATTRIBUTE Winner INTEGER\n') 276 | tvz.write('\n@ATTRIBUTE Winner INTEGER\n') 277 | zvz.write('\n@ATTRIBUTE Winner INTEGER\n') 278 | for a in protoss: 279 | pvp.write('@ATTRIBUTE ' + a + ' INTEGER\n') 280 | for a in protoss: 281 | pvp.write('@ATTRIBUTE ' + a + ' INTEGER\n') 282 | for a in protoss: 283 | pvt.write('@ATTRIBUTE ' + a + ' INTEGER\n') 284 | for a in terran: 285 | pvt.write('@ATTRIBUTE ' + a + ' INTEGER\n') 286 | for a in protoss: 287 | pvz.write('@ATTRIBUTE ' + a + ' INTEGER\n') 288 | for a in zerg: 289 | pvz.write('@ATTRIBUTE ' + a + ' INTEGER\n') 290 | for a in terran: 291 | tvt.write('@ATTRIBUTE ' + a + ' INTEGER\n') 292 | for a in terran: 293 | tvt.write('@ATTRIBUTE ' + a + ' INTEGER\n') 294 | for a in terran: 295 | tvz.write('@ATTRIBUTE ' + a + ' INTEGER\n') 296 | for a in zerg: 297 | tvz.write('@ATTRIBUTE ' + a + ' INTEGER\n') 298 | for a in zerg: 299 | zvz.write('@ATTRIBUTE ' + a + ' INTEGER\n') 300 | for a in zerg: 301 | zvz.write('@ATTRIBUTE ' + a + ' INTEGER\n') 302 | pvp.write('\n@DATA\n') 303 | pvt.write('\n@DATA\n') 304 | pvz.write('\n@DATA\n') 305 | tvt.write('\n@DATA\n') 306 | tvz.write('\n@DATA\n') 307 | zvz.write('\n@DATA\n') 308 | -------------------------------------------------------------------------------- /clustering/README: -------------------------------------------------------------------------------- 1 | Original "scm*.arff" datasets from Ben Weber and Michael Matteas (UCSC) 2 | They can be found here: http://eis.ucsc.edu/StarCraft_Data_Mining 3 | 4 | If you want to label a .txt or an .arff, just to: 5 | python clustering.py *_X*.{txt|arff} [--serialize] [--plotR] [--plotM] 6 | with X being the race to be analysed 7 | If you want to annote an existing *_X*.txt file, you need to use clustering.py 8 | with --serialize on it first and then: 9 | python annotate.py *_X*.txt -w 10 | 11 | 12 | -------------------------------------------------------------------------------- /clustering/annotate.py: -------------------------------------------------------------------------------- 1 | import sys, pickle, copy, math 2 | 3 | # usage: 4 | # python annotate.py matchs.txt -w 5 | # will _w_rite matchsannotated.txt 6 | # with each player's most probable opening noted (last feature of each line) 7 | # python annotate.py given_player_games.txt -s 8 | # will print a _s_ummary of the players openings 9 | 10 | f = open(sys.argv[1], 'r') 11 | ptemplate = [] 12 | ttemplate = [] 13 | ztemplate = [] 14 | pdatal = [] 15 | tdatal = [] 16 | zdatal = [] 17 | 18 | def parse(l): 19 | if l == '': 20 | return 21 | ### Hack to remove names and winners 22 | indn = l.find("Name") 23 | if (indn >= 0): 24 | l = l[:indn]+l[l.find('; ', indn)+2:] 25 | indn = l.find("Winner") 26 | if (indn >= 0): 27 | l = l[:indn]+l[l.find('; ', indn)+2:] 28 | ### /End Hack 29 | lt = l.split(' ') 30 | d = [] 31 | le = l.replace('; ',';').split(';') 32 | for elem in le: 33 | if len(elem.split(' ')) > 1: 34 | d.append(int(elem.split(' ')[1])) 35 | if "Protoss_" in l: 36 | if len(ptemplate) == 0: 37 | ptemplate.extend([lt[2*i] for i in range(len(lt)/2)]) 38 | pdatal.append(d) 39 | elif "Terran_" in l: 40 | if len(ttemplate) == 0: 41 | ttemplate.extend([lt[2*i] for i in range(len(lt)/2)]) 42 | tdatal.append(d) 43 | elif "Zerg_" in l: 44 | if len(ztemplate) == 0: 45 | ztemplate.extend([lt[2*i] for i in range(len(lt)/2)]) 46 | zdatal.append(d) 47 | 48 | def pnorm(x, m, s): 49 | """ 50 | Compute the multivariate normal distribution with values vector x, 51 | mean vector m, sigma (variances/covariances) matrix s 52 | """ 53 | xmt = np.matrix(x-m).transpose() 54 | for i in range(len(s)): 55 | if s[i,i] <= sys.float_info[3]: # min float 56 | s[i,i] = sys.float_info[3] 57 | sinv = np.linalg.inv(s) 58 | xm = np.matrix(x-m) 59 | return (2.0*math.pi)**(-len(x)/2.0)*(1.0/math.sqrt(np.linalg.det(s)))\ 60 | *math.exp(-0.5*(xm*sinv*xmt)) 61 | 62 | def annotate(data, *args): 63 | def determine_cluster_ind(clusters): 64 | """ 65 | The labeling cluster should be the one with globally smaller means 66 | __and__ the one with the smaller time to accomplish its first feature 67 | """ 68 | ### /!\ shitty heuristic to determine which cluster is the one labeled 69 | cind1 = -1 70 | cind2 = -1 71 | minnorm = 10000000000000000000000000000.0 # ;) 72 | minff = 10000000000000000000000000000.0 # ;) 73 | if clusters.has_key('params'): 74 | params = clusters['params'] 75 | elif clusters.has_key('centroids'): 76 | params = clusters['centroids'] 77 | for i in range(len(params)): 78 | if clusters.has_key('params'): 79 | tmpnorm = np.linalg.norm(params[i]['mu']) # global cluster i means 80 | tmpff = params[i]['mu'][0] # mean time to have first feature 81 | elif clusters.has_key('centroids'): 82 | tmpnorm = np.linalg.norm(params[i]) # global cluster i means 83 | tmpff = params[i][0] # mean time to have first feature 84 | if tmpnorm < minnorm: 85 | minnorm = tmpnorm 86 | cind1 = i 87 | if tmpff < minff: 88 | minff = tmpff 89 | cind2 = i 90 | if cind1 == cind2: 91 | return cind1 92 | else: 93 | print "ERROR: Problem determining labeling cluster:", 94 | print clusters['name'] 95 | print "with feature:", clusters['features'][0] 96 | print "min norm:", minnorm, " indice: ", cind1 97 | print "min first feature:", minff, " indice: ", cind2 98 | sys.exit(-1) 99 | annotations = {} 100 | annotations['openings'] = [{} for i in range(len(data))] 101 | annotations['games'] = copy.deepcopy(data) 102 | 103 | maxdim = 1.0 * max([len(d[1][0]) for d,useless in args if len(d[0]) > 0]) 104 | 105 | for (d, clusters) in args: 106 | if len(d[0]) == 0: 107 | continue 108 | # determine the indice of the labeling cluster! 109 | cind = determine_cluster_ind(clusters) 110 | 111 | for i,game_data in enumerate(d[1]): 112 | tmpproba = pnorm(game_data, 113 | clusters['params'][cind]['mu'], 114 | clusters['params'][cind]['sigma']) 115 | tmpproba = tmpproba**(maxdim/len(game_data)) 116 | annotations['openings'][d[0][i]][clusters['name']] = tmpproba 117 | return annotations 118 | 119 | def most_probable_opening(di): 120 | mpo = '' 121 | mp = -0.1 122 | for k, v in di.iteritems(): 123 | if v > mp: 124 | mpo = k 125 | return mpo 126 | 127 | for line in f: 128 | parse(line.rstrip('\r\n')) 129 | f.close() 130 | 131 | import numpy as np 132 | import clustering 133 | clustering.formating = 'txt' 134 | 135 | p_notes = {'openings' : {}} 136 | t_notes = {'openings' : {}} 137 | z_notes = {'openings' : {}} 138 | 139 | if len(pdatal): 140 | print "Protoss player(s) detected in this file" 141 | f_ser = open("Protoss_models", 'r') 142 | two_gates = pickle.load(f_ser) 143 | fast_dt = pickle.load(f_ser) 144 | templar = pickle.load(f_ser) 145 | speedzeal = pickle.load(f_ser) 146 | corsair = pickle.load(f_ser) 147 | nony = pickle.load(f_ser) 148 | reaver_drop = pickle.load(f_ser) 149 | f_ser.close() 150 | pdata = np.ndarray([len(pdatal), len(pdatal[0])], np.float64) 151 | pdata /= 24 152 | for i in range(len(pdatal)): 153 | for j in range(len(pdatal[0])): 154 | pdata[i][j] = pdatal[i][j] 155 | two_gates_data = clustering.filter_out_undef(pdata.take( 156 | [ptemplate.index("Protoss_Gateway2"),\ 157 | ptemplate.index("Protoss_Gateway"),\ 158 | ptemplate.index("Protoss_Zealot")], 1)) 159 | fast_dt_data = clustering.filter_out_undef(pdata.take( 160 | [ptemplate.index("Protoss_Dark_Templar")], 1)) 161 | speedzeal_data = clustering.filter_out_undef(pdata.take( 162 | [ptemplate.index("Protoss_Zealot_Speed"),\ 163 | ptemplate.index("Protoss_Ground_Weapons")], 1)) 164 | templar_data = clustering.filter_out_undef(pdata.take( 165 | [ptemplate.index("Protoss_Psionic_Storm"),\ 166 | ptemplate.index("Protoss_High_Templar")], 1)) 167 | corsair_data = clustering.filter_out_undef(pdata.take( 168 | [ptemplate.index("Protoss_Corsair")], 1)) 169 | nony_data = clustering.filter_out_undef(pdata.take( 170 | [ptemplate.index("Protoss_Dragoon"),\ 171 | ptemplate.index("Protoss_Dragoon_Range")], 1)) 172 | reaver_drop_data = clustering.filter_out_undef(pdata.take( 173 | [ptemplate.index("Protoss_Reaver"),\ 174 | ptemplate.index("Protoss_Shuttle")], 1)) 175 | 176 | p_notes = annotate(pdata, 177 | (two_gates_data, two_gates), (fast_dt_data, fast_dt),\ 178 | (templar_data, templar), (speedzeal_data, speedzeal),\ 179 | (corsair_data, corsair),\ 180 | (nony_data, nony), (reaver_drop_data, reaver_drop)) 181 | 182 | if len(tdatal): 183 | print "Terran player(s) detected in this file" 184 | f_ser = open("Terran_models", 'r') 185 | bio = pickle.load(f_ser) 186 | rax_fe = pickle.load(f_ser) 187 | two_facto = pickle.load(f_ser) 188 | vultures = pickle.load(f_ser) 189 | drop = pickle.load(f_ser) 190 | f_ser.close() 191 | tdata = np.ndarray([len(tdatal), len(tdatal[0])], np.float64) 192 | tdata /= 24 193 | for i in range(len(tdatal)): 194 | for j in range(len(tdatal[0])): 195 | tdata[i][j] = tdatal[i][j] 196 | bio_data = clustering.filter_out_undef(tdata.take( 197 | [ttemplate.index("Terran_Barracks3"),\ 198 | ttemplate.index("Terran_Barracks2"),\ 199 | ttemplate.index("Terran_Barracks")], 1)) 200 | rax_fe_data = clustering.filter_out_undef(tdata.take( 201 | [ttemplate.index("Terran_Expansion"),\ 202 | ttemplate.index("Terran_Barracks")], 1)) 203 | two_facto_data = clustering.filter_out_undef(tdata.take( 204 | [ttemplate.index("Terran_Factory2")], 1)) 205 | vultures_data = clustering.filter_out_undef(tdata.take( 206 | [ttemplate.index("Terran_Spider_Mines"),\ 207 | ttemplate.index("Terran_Vulture")], 1)) 208 | drop_data = clustering.filter_out_undef(tdata.take( 209 | [ttemplate.index("Terran_Dropship")], 1)) 210 | 211 | t_notes = annotate(tdata, 212 | (bio_data, bio), (rax_fe_data, rax_fe),\ 213 | (two_facto_data, two_facto), (vultures_data, vultures),\ 214 | (drop_data, drop)) 215 | 216 | if len(zdatal): 217 | print "Zerg player(s) detected in this file" 218 | f_ser = open("Zerg_models", 'r') 219 | speedlings = pickle.load(f_ser) 220 | fast_mutas = pickle.load(f_ser) 221 | mutas = pickle.load(f_ser) 222 | lurkers = pickle.load(f_ser) 223 | hydras = pickle.load(f_ser) 224 | f_ser.close() 225 | zdata = np.ndarray([len(zdatal), len(zdatal[0])], np.float64) 226 | zdata /= 24 227 | for i in range(len(zdatal)): 228 | for j in range(len(zdatal[0])): 229 | zdata[i][j] = zdatal[i][j] 230 | speedlings_data = clustering.filter_out_undef(zdata.take( 231 | [ztemplate.index("Zerg_Zergling_Speed"),\ 232 | ztemplate.index("Zerg_Spawning_Pool"),\ 233 | ztemplate.index("Zerg_Zergling")], 1)) 234 | fast_mutas_data = clustering.filter_out_undef(zdata.take( 235 | [ztemplate.index("Zerg_Mutalisk"),\ 236 | ztemplate.index("Zerg_Extractor")], 1)) 237 | mutas_data = clustering.filter_out_undef(zdata.take( 238 | [ztemplate.index("Zerg_Expansion2"),\ 239 | ztemplate.index("Zerg_Mutalisk")], 1)) 240 | lurkers_data = clustering.filter_out_undef(zdata.take( 241 | [ztemplate.index("Zerg_Lurker")], 1)) 242 | hydras_data = clustering.filter_out_undef(zdata.take( 243 | [ztemplate.index("Zerg_Hydralisk"),\ 244 | ztemplate.index("Zerg_Hydralisk_Speed"),\ 245 | ztemplate.index("Zerg_Hydralisk_Range")], 1)) 246 | 247 | z_notes = annotate(zdata, 248 | (speedlings_data, speedlings), (fast_mutas_data, fast_mutas),\ 249 | (mutas_data, mutas), (lurkers_data, lurkers),\ 250 | (hydras_data, hydras)) 251 | 252 | 253 | if len(sys.argv) > 2: 254 | players_list = [] 255 | if sys.argv[2] == '-w': 256 | f = open(sys.argv[1], 'r') 257 | tow = open(sys.argv[1][:-4] + '_annotated.txt', 'w') 258 | i = -1 259 | j = -1 260 | k = -1 261 | p1 = "" 262 | p2 = "" 263 | op = "" 264 | ops = {} 265 | p1_op = "" 266 | p1_ops = {} 267 | matchs_ups = {} 268 | for line in f: 269 | if p1 != "" and p2 != "": 270 | if not p1 in matchs_ups: 271 | matchs_ups[p1] = {} 272 | if not p2 in matchs_ups[p1]: 273 | matchs_ups[p1][p2] = {'most_probable_openings': [(p1_op, op)], 274 | 'openings': [(p1_ops, ops)]} 275 | else: 276 | matchs_ups[p1][p2]['most_probable_openings'].append((p1_op, op)) 277 | matchs_ups[p1][p2]['openings'].append((p1_ops, ops)) 278 | p1 = "" 279 | p2 = "" 280 | p1_op = op 281 | p1_ops = ops 282 | line = line.rstrip('\r\n') 283 | op = "" 284 | if "Protoss_" in line: 285 | i += 1 286 | ops = p_notes['openings'][i] 287 | op = most_probable_opening(ops) 288 | elif "Terran_" in line: 289 | j += 1 290 | ops = t_notes['openings'][j] 291 | op = most_probable_opening(ops) 292 | elif "Zerg_" in line: 293 | k += 1 294 | ops = z_notes['openings'][k] 295 | op = most_probable_opening(ops) 296 | if "Name" in line: 297 | name = line[line.find("Name")+5:line.find(";",line.find("Name"))] 298 | if p1 != "": 299 | p2 = name 300 | else: 301 | p1 = name 302 | if name not in players_list: 303 | players_list.append(name) 304 | if "Winner" in line: 305 | if op == "": 306 | tow.write(line + 'Opening Unknown;\n') 307 | else: 308 | tow.write(line + 'Opening ' + op + ';\n') 309 | else: 310 | if op != "": 311 | tow.write(line + 'Opening ' + op + ';\n') 312 | tow.close() 313 | 314 | #DEBUG mmpo = {} 315 | #DEBUG for p1 in players_list: 316 | #DEBUG mmpo[p1] = {} 317 | #DEBUG for p2 in players_list: 318 | #DEBUG mmpo[p1][p2] = {} 319 | #DEBUG for p1 in players_list: 320 | #DEBUG #print 'p1:', p1 321 | #DEBUG for p2 in players_list: 322 | #DEBUG #print 'p2:', p2 323 | #DEBUG if p1 in matchs_ups and p2 in matchs_ups[p1]: 324 | #DEBUG for opgames in matchs_ups[p1][p2]['most_probable_openings']: 325 | #DEBUG # print opgames 326 | #DEBUG if opgames[0] not in mmpo[p1][p2]: 327 | #DEBUG mmpo[p1][p2][opgames[0]] = 1 328 | #DEBUG else: 329 | #DEBUG mmpo[p1][p2][opgames[0]] += 1 330 | #DEBUG if opgames[1] not in mmpo[p2][p1]: 331 | #DEBUG mmpo[p2][p1][opgames[1]] = 1 332 | #DEBUG else: 333 | #DEBUG mmpo[p2][p1][opgames[1]] += 1 334 | #DEBUG print " >>>>>>>>>>>>> " 335 | #DEBUG print mmpo 336 | #DEBUG print " <<<<<<<<<<<<< " 337 | 338 | matrix_mpo = {} 339 | matrix_ops = {} 340 | for plyr1, di in matchs_ups.iteritems(): 341 | if plyr1 not in matrix_mpo: 342 | matrix_mpo[plyr1] = {} 343 | if plyr1 not in matrix_ops: 344 | matrix_ops[plyr1] = {} 345 | for plyr2, ops in di.iteritems(): 346 | if plyr2 not in matrix_mpo: 347 | matrix_mpo[plyr2] = {} 348 | if plyr2 not in matrix_ops: 349 | matrix_ops[plyr2] = {} 350 | if plyr1 not in matrix_mpo[plyr2]: 351 | matrix_mpo[plyr2][plyr1] = {} 352 | if plyr1 not in matrix_ops[plyr2]: 353 | matrix_ops[plyr2][plyr1] = {} 354 | if plyr2 not in matrix_mpo[plyr1]: 355 | matrix_mpo[plyr1][plyr2] = {} 356 | if plyr2 not in matrix_ops[plyr1]: 357 | matrix_ops[plyr1][plyr2] = {} 358 | for m in ops['most_probable_openings']: 359 | if m[0] not in matrix_mpo[plyr1][plyr2]: 360 | matrix_mpo[plyr1][plyr2][m[0]] = 1 361 | else: 362 | matrix_mpo[plyr1][plyr2][m[0]] += 1 363 | if m[1] not in matrix_mpo[plyr2][plyr1]: 364 | matrix_mpo[plyr2][plyr1][m[1]] = 1 365 | else: 366 | matrix_mpo[plyr2][plyr1][m[1]] += 1 367 | for match in ops['openings']: 368 | for k, v in match[0].iteritems(): 369 | if k not in matrix_ops[plyr1][plyr2]: 370 | matrix_ops[plyr1][plyr2][k] = v 371 | else: 372 | matrix_ops[plyr1][plyr2][k] += v 373 | for k, v in match[1].iteritems(): 374 | if k not in matrix_ops[plyr2][plyr1]: 375 | matrix_ops[plyr2][plyr1][k] = v 376 | else: 377 | matrix_ops[plyr2][plyr1][k] += v 378 | print "most probable openings per match-ups (player1->player2->p1_openings)" 379 | print matrix_mpo 380 | print "======================================" 381 | print "distribution on openings per match-ups" 382 | print matrix_ops 383 | 384 | elif sys.argv[2] == '-s': 385 | openings = {} 386 | most_prob_openings = {} 387 | ngames = 0 # just for verification 388 | for game_openings in [t['openings'] for t in [p_notes, 389 | t_notes, z_notes]]: 390 | for game in game_openings: 391 | ngames += 1 392 | mpop = most_probable_opening(game) 393 | if mpop in most_prob_openings: 394 | most_prob_openings[mpop] += 1 395 | else: 396 | most_prob_openings[mpop] = 1 397 | for o, p in game.iteritems(): 398 | if o in openings: 399 | openings[o] = (openings[o][0]+1, openings[o][1]+p) 400 | else: 401 | openings[o] = (1, p) 402 | tmpdiv = 0.0 403 | for op, v in openings.iteritems(): 404 | openings[op] = (v[0], v[1] / v[0]) 405 | tmpdiv += openings[op][1] 406 | for op, v in openings.iteritems(): 407 | openings[op] = (v[0], v[1] / tmpdiv) 408 | print most_prob_openings 409 | print openings 410 | print ngames 411 | 412 | 413 | -------------------------------------------------------------------------------- /clustering/count_all.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | unknown=0 3 | two_gates=0 4 | fast_dt=0 5 | templar=0 6 | speedzeal=0 7 | corsair=0 8 | nony=0 9 | reaver_drop=0 10 | for name in `ls my*Protoss*` 11 | do 12 | echo $name 13 | echo 'unknown:' && cat $name | grep 'unknown' | wc -l 14 | ((unknown = unknown+`cat $name | grep 'unknown' | wc -l`)) 15 | echo 'two_gates:' && cat $name | grep 'two_gates' | wc -l 16 | ((two_gates = two_gates+`cat $name | grep 'two_gates' | wc -l`)) 17 | echo 'fast_dt:' && cat $name | grep 'fast_dt' | wc -l 18 | ((fast_dt = fast_dt+`cat $name | grep 'fast_dt' | wc -l`)) 19 | echo 'templar:' && cat $name | grep 'templar' | wc -l 20 | ((templar = templar+`cat $name | grep 'templar' | wc -l`)) 21 | echo 'speedzeal:' && cat $name | grep 'speedzeal' | wc -l 22 | ((speedzeal = speedzeal+`cat $name | grep 'speedzeal' | wc -l`)) 23 | echo 'corsair:' && cat $name | grep 'corsair' | wc -l 24 | ((corsair = corsair+`cat $name | grep 'corsair' | wc -l`)) 25 | echo 'nony:' && cat $name | grep 'nony' | wc -l 26 | ((nony = nony+`cat $name | grep 'nony' | wc -l`)) 27 | echo 'reaver_drop:' && cat $name | grep 'reaver_drop' | wc -l 28 | ((reaver_drop = reaver_drop+`cat $name | grep 'reaver_drop' | wc -l`)) 29 | done 30 | total=0 31 | ((total=unknown+two_gates+fast_dt+templar+speedzeal+corsair+nony+reaver_drop)) 32 | echo 'Protoss:' 33 | echo 'two_gates:' && echo $two_gates 34 | echo 'fast_dt:' && echo $fast_dt 35 | echo 'templar:' && echo $templar 36 | echo 'speedzeal:' && echo $speedzeal 37 | echo 'corsair:' && echo $corsair 38 | echo 'nony:' && echo $nony 39 | echo 'reaver_drop:' && echo $reaver_drop 40 | echo 'unknown:' && echo $unknown 41 | echo 'total:' && echo $total 42 | 43 | for name in `ls my*Terran*` 44 | do 45 | echo $name 46 | echo 'unknown:' && cat $name | grep 'unknown' | wc -l 47 | echo 'bio:' && cat $name | grep 'bio' | wc -l 48 | echo 'rax_fe:' && cat $name | grep 'rax_fe' | wc -l 49 | echo 'two_facto:' && cat $name | grep 'two_facto' | wc -l 50 | echo 'vultures:' && cat $name | grep 'vultures' | wc -l 51 | echo 'drop:' && cat $name | grep 'drop' | wc -l 52 | done 53 | for name in `ls my*Zerg*` 54 | do 55 | echo $name 56 | echo 'unknown:' && cat $name | grep 'unknown' | wc -l 57 | echo 'speedlings:' && cat $name | grep 'speedlings' | wc -l 58 | echo 'fast_mutas:' && cat $name | grep 'fast_mutas' | wc -l 59 | echo 'mutas:' && cat $name | grep 'mutas' | wc -l 60 | echo 'lurkers:' && cat $name | grep 'lurkers' | wc -l 61 | echo 'hydras:' && cat $name | grep 'hydras' | wc -l 62 | done 63 | #!/bin/bash 64 | for name in `ls scm*Protoss*` 65 | do 66 | echo $name 67 | echo 'FastLegs:' && cat $name | grep 'FastLegs' | wc -l 68 | echo 'FastDT:' && cat $name | grep 'FastDT' | wc -l 69 | echo 'FastObs:' && cat $name | grep 'FastObs' | wc -l 70 | echo 'ReaverDrop:' && cat $name | grep 'ReaverDrop' | wc -l 71 | echo 'Carrier:' && cat $name | grep 'Carrier' | wc -l 72 | echo 'FastExpand:' && cat $name | grep 'FastExpand' | wc -l 73 | echo 'Unknown:' && cat $name | grep 'Unknown' | wc -l 74 | done 75 | for name in `ls scm*Terran*` 76 | do 77 | echo $name 78 | echo 'Bio:' && cat $name | grep 'Bio' | wc -l 79 | echo 'TwoFactory:' && cat $name | grep 'TwoFactory' | wc -l 80 | echo 'VultureHarass:' && cat $name | grep 'VultureHarass' | wc -l 81 | echo 'SiegeExpand:' && cat $name | grep 'SiegeExpand' | wc -l 82 | echo 'Standard:' && cat $name | grep 'Standard' | wc -l 83 | echo 'FastDropship:' && cat $name | grep 'FastDropship' | wc -l 84 | echo 'Unknown:' && cat $name | grep 'Unknown' | wc -l 85 | done 86 | for name in `ls scm*Zerg*` 87 | do 88 | echo $name 89 | echo 'HatchMuta:' && cat $name | grep 'HatchMuta' | wc -l 90 | echo 'ThreeHatchMuta:' && cat $name | grep 'ThreeHatchMuta' | wc -l 91 | echo 'TwoHatchMuta:' && cat $name | grep 'TwoHatchMuta' | wc -l 92 | echo 'HydraRush:' && cat $name | grep 'HydraRush' | wc -l 93 | echo 'Standard:' && cat $name | grep 'Standard' | wc -l 94 | echo 'HydraMass:' && cat $name | grep 'HydraMass' | wc -l 95 | echo 'Unknown:' && cat $name | grep 'Unknown' | wc -l 96 | echo 'Lurker:' && cat $name | grep 'Lurker' | wc -l 97 | done 98 | -------------------------------------------------------------------------------- /clustering/count_unknown.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | for name in `ls my*`; do echo $name && cat $name | grep 'unknown' | wc -l; done 3 | -------------------------------------------------------------------------------- /clustering/count_unknown_orig.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | for name in `ls scm*.arff`; do echo $name && cat $name | grep 'Unknown' | wc -l; done 3 | -------------------------------------------------------------------------------- /clustering/latex_table.py: -------------------------------------------------------------------------------- 1 | f = open('TEMP.txt', 'r') 2 | 3 | mu = "" 4 | a = {} 5 | previous = "" 6 | for line in f: 7 | #print previous 8 | l = line.rstrip('\r\n') 9 | if "scm" in l: 10 | active = False 11 | if "myscm" in l: 12 | active = True 13 | first = l.split('_')[1][0] 14 | fakemu = l.split('_')[0][-3:] 15 | if first == fakemu[0]: 16 | mu = fakemu 17 | else: 18 | mu = first + 'v' + fakemu[0] 19 | a[mu] = {} 20 | if active: 21 | if ':' in l: 22 | l = l.rstrip(':') 23 | #print l 24 | previous = l 25 | else: 26 | a[mu][previous] = l.strip(' ') 27 | 28 | print a 29 | 30 | for KK in range(10): 31 | i = 0 32 | s = "" 33 | for mu in ['PvP','PvT','PvZ','TvP','TvT','TvZ','ZvP','ZvT','ZvZ']: 34 | try: 35 | op, nb = a[mu].popitem() 36 | except: 37 | op = "" 38 | nb = "" 39 | if (i % 3) == 0: 40 | s += op + " & " 41 | s += nb + " & " 42 | i += 1 43 | print s 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /clustering/launch_labeling.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | for name in `ls scm*.arff` 3 | do echo $name && python clustering.py $name 4 | done 5 | -------------------------------------------------------------------------------- /count_min.py: -------------------------------------------------------------------------------- 1 | #!/opt/local/bin/python 2 | # Usage: cat t[PVZ]v[PVZ].txt | pyt count_min.py 3 | import sys 4 | m = 1000000 5 | for line in sys.stdin: 6 | c = len(line.split(';')) 7 | c -= 1 8 | if c < m: 9 | m = c 10 | print m 11 | 12 | -------------------------------------------------------------------------------- /enums_name_tables.h: -------------------------------------------------------------------------------- 1 | #ifndef ENUMS_NAME_TABLES 2 | #define ENUMS_NAME_TABLES 3 | 4 | #include 5 | #include 6 | #include 7 | 8 | /// Copyright Gabriel Synnaeve 2011 9 | /// This code is under 3-clauses (new) BSD License 10 | 11 | #define TERRAN_X_UNITS \ 12 | X(Terran_Marine, (const char*) "Terran_Marine") \ 13 | X(Terran_Ghost, (const char*) "Terran_Ghost") \ 14 | X(Terran_Vulture, (const char*) "Terran_Vulture") \ 15 | X(Terran_Goliath, (const char*) "Terran_Goliath") \ 16 | X(Terran_Siege, (const char*) "Terran_Siege_Tank") \ 17 | X(Terran_SCV, (const char*) "Terran_SCV") \ 18 | X(Terran_Wraith, (const char*) "Terran_Wraith") \ 19 | X(Terran_Science_Vessel, (const char*) "Terran_Science_Vessel") \ 20 | X(Terran_Dropship, (const char*) "Terran_Dropship") \ 21 | X(Terran_Battlecruiser, (const char*) "Terran_Battlecruiser") \ 22 | X(Terran_Vulture_Spider_Mine, (const char*) "Terran_Vulture_Spider_Mine") \ 23 | X(Terran_Nuclear_Missile, (const char*) "Terran_Nuclear_Missile") \ 24 | X(Terran_Siege_Tank_Siege_Mode, (const char*) "Terran_Siege_Tank_Siege_Mode") \ 25 | X(Terran_Firebat, (const char*) "Terran_Firebat") \ 26 | X(Terran_Medic, (const char*) "Terran_Medic") \ 27 | X(Terran_Valkyrie, (const char*) "Terran_Valkyrie") 28 | 29 | #define X(a, b) a, 30 | enum Terran_Units 31 | { 32 | TERRAN_X_UNITS 33 | }; 34 | #undef X 35 | 36 | #define X(a, b) b, 37 | const char* terran_units_name[] = 38 | { 39 | TERRAN_X_UNITS 40 | }; 41 | #undef X 42 | 43 | #define NB_TERRAN_UNITS 16 44 | 45 | #define TERRAN_X_BUILDINGS \ 46 | X(Terran_Command_Center, (const char*) "Terran_Command_Center") \ 47 | X(Terran_Expansion, (const char*) "Terran_Expansion") \ 48 | X(Terran_Comsat_Station, (const char*) "Terran_Comsat_Station") \ 49 | X(Terran_Nuclear_Silo, (const char*) "Terran_Nuclear_Silo") \ 50 | X(Terran_Supply_Depot, (const char*) "Terran_Supply_Depot") \ 51 | X(Terran_Refinery, (const char*) "Terran_Refinery") \ 52 | X(Terran_Barracks, (const char*) "Terran_Barracks") \ 53 | X(Terran_Barracks2, (const char*) "Terran_Barracks2") \ 54 | X(Terran_Academy, (const char*) "Terran_Academy") \ 55 | X(Terran_Factory, (const char*) "Terran_Factory") \ 56 | X(Terran_Starport, (const char*) "Terran_Starport") \ 57 | X(Terran_Control_Tower, (const char*) "Terran_Control_Tower") \ 58 | X(Terran_Science_Facility, (const char*) "Terran_Science_Facility") \ 59 | X(Terran_Covert_Ops, (const char*) "Terran_Covert_Ops") \ 60 | X(Terran_Physics_Lab, (const char*) "Terran_Physics_Lab") \ 61 | X(Terran_Machine_Shop, (const char*) "Terran_Machine_Shop") \ 62 | X(Terran_Engineering_Bay, (const char*) "Terran_Engineering_Bay") \ 63 | X(Terran_Armory, (const char*) "Terran_Armory") \ 64 | X(Terran_Missile_Turret, (const char*) "Terran_Missile_Turret") \ 65 | X(Terran_Bunker, (const char*) "Terran_Bunker") 66 | 67 | #define X(a, b) a, 68 | enum Terran_Buildings 69 | { 70 | TERRAN_X_BUILDINGS 71 | }; 72 | #undef X 73 | 74 | #define X(a, b) b, 75 | const char* terran_buildings_name[] = 76 | { 77 | TERRAN_X_BUILDINGS 78 | }; 79 | #undef X 80 | 81 | #define NB_TERRAN_BUILDINGS 20 // 18 buildings + rax2 + expand 82 | 83 | #define PROTOSS_X_UNITS \ 84 | X(Protoss_Corsair, (const char*) "Protoss_Corsair") \ 85 | X(Protoss_Dark_Templar, (const char*) "Protoss_Dark_Templar") \ 86 | X(Protoss_Dark_Archon, (const char*) "Protoss_Dark_Archon") \ 87 | X(Protoss_Probe, (const char*) "Protoss_Probe") \ 88 | X(Protoss_Zealot, (const char*) "Protoss_Zealot") \ 89 | X(Protoss_Dragoon, (const char*) "Protoss_Dragoon") \ 90 | X(Protoss_High_Templar, (const char*) "Protoss_High_Templar") \ 91 | X(Protoss_Archon, (const char*) "Protoss_Archon") \ 92 | X(Protoss_Shuttle, (const char*) "Protoss_Shuttle") \ 93 | X(Protoss_Scout, (const char*) "Protoss_Scout") \ 94 | X(Protoss_Arbiter, (const char*) "Protoss_Arbiter") \ 95 | X(Protoss_Carrier, (const char*) "Protoss_Carrier") \ 96 | X(Protoss_Interceptor, (const char*) "Protoss_Interceptor") \ 97 | X(Protoss_Reaver, (const char*) "Protoss_Reaver") \ 98 | X(Protoss_Observer, (const char*) "Protoss_Observer") \ 99 | X(Protoss_Scarab, (const char*) "Protoss_Scarab") 100 | 101 | #define X(a, b) a, 102 | enum Protoss_Units 103 | { 104 | PROTOSS_X_UNITS 105 | }; 106 | #undef X 107 | 108 | #define X(a, b) b, 109 | const char* protoss_units_name[] = 110 | { 111 | PROTOSS_X_UNITS 112 | }; 113 | #undef X 114 | 115 | #define NB_PROTOSS_UNITS 16 116 | 117 | #define PROTOSS_X_BUILDINGS \ 118 | X(Protoss_Nexus, (const char*) "Protoss_Nexus") \ 119 | X(Protoss_Expansion, (const char*) "Protoss_Expansion") \ 120 | X(Protoss_Robotics_Facility, (const char*) "Protoss_Robotics_Facility") \ 121 | X(Protoss_Pylon, (const char*) "Protoss_Pylon") \ 122 | X(Protoss_Pylon2, (const char*) "Protoss_Pylon2") \ 123 | X(Protoss_Assimilator, (const char*) "Protoss_Assimilator") \ 124 | X(Protoss_Observatory, (const char*) "Protoss_Observatory") \ 125 | X(Protoss_Gateway, (const char*) "Protoss_Gateway") \ 126 | X(Protoss_Gateway2, (const char*) "Protoss_Gateway2") \ 127 | X(Protoss_Photon_Cannon, (const char*) "Protoss_Photon_Cannon") \ 128 | X(Protoss_Citadel_of_Adun, (const char*) "Protoss_Citadel_of_Adun") \ 129 | X(Protoss_Cybernetics_Core, (const char*) "Protoss_Cybernetics_Core") \ 130 | X(Protoss_Templar_Archives, (const char*) "Protoss_Templar_Archives") \ 131 | X(Protoss_Forge, (const char*) "Protoss_Forge") \ 132 | X(Protoss_Stargate, (const char*) "Protoss_Stargate") \ 133 | X(Protoss_Fleet_Beacon, (const char*) "Protoss_Fleet_Beacon") \ 134 | X(Protoss_Arbiter_Tribunal, (const char*) "Protoss_Arbiter_Tribunal") \ 135 | X(Protoss_Robotics_Support_Bay, (const char*) "Protoss_Robotics_Support_Bay") \ 136 | X(Protoss_Shield_Battery, (const char*) "Protoss_Shield_Battery") 137 | 138 | #define X(a, b) a, 139 | enum Protoss_Buildings 140 | { 141 | PROTOSS_X_BUILDINGS 142 | }; 143 | #undef X 144 | 145 | #define X(a, b) b, 146 | const char* protoss_buildings_name[] = 147 | { 148 | PROTOSS_X_BUILDINGS 149 | }; 150 | #undef X 151 | 152 | #define NB_PROTOSS_BUILDINGS 19 // 16 buildings + pylon2 + gate2 + expand 153 | 154 | #define ZERG_X_UNITS \ 155 | X(Zerg_Larva, (const char*) "Zerg_Larva") \ 156 | X(Zerg_Egg, (const char*) "Zerg_Egg") \ 157 | X(Zerg_Zergling, (const char*) "Zerg_Zergling") \ 158 | X(Zerg_Hydralisk, (const char*) "Zerg_Hydralisk") \ 159 | X(Zerg_Ultralisk, (const char*) "Zerg_Ultralisk") \ 160 | X(Zerg_Broodling, (const char*) "Zerg_Broodling") \ 161 | X(Zerg_Drone, (const char*) "Zerg_Drone") \ 162 | X(Zerg_Overlord, (const char*) "Zerg_Overlord") \ 163 | X(Zerg_Mutalisk, (const char*) "Zerg_Mutalisk") \ 164 | X(Zerg_Guardian, (const char*) "Zerg_Guardian") \ 165 | X(Zerg_Queen, (const char*) "Zerg_Queen") \ 166 | X(Zerg_Defiler, (const char*) "Zerg_Defiler") \ 167 | X(Zerg_Scourge, (const char*) "Zerg_Scourge") \ 168 | X(Zerg_Infested_Terran, (const char*) "Zerg_Infested_Terran") \ 169 | X(Zerg_Cocoon, (const char*) "Zerg_Cocoon") \ 170 | X(Zerg_Devourer, (const char*) "Zerg_Devourer") \ 171 | X(Zerg_Lurker_Egg, (const char*) "Zerg_Lurker_Egg") \ 172 | X(Zerg_Lurker, (const char*) "Zerg_Lurker") 173 | 174 | #define X(a, b) a, 175 | enum Zerg_Units 176 | { 177 | ZERG_X_UNITS 178 | }; 179 | #undef X 180 | 181 | #define X(a, b) b, 182 | const char* zerg_units_name[] = 183 | { 184 | ZERG_X_UNITS 185 | }; 186 | #undef X 187 | 188 | #define NB_ZERG_UNITS 18 189 | 190 | #define ZERG_X_BUILDINGS \ 191 | X(Zerg_Hatchery, (const char*) "Zerg_Hatchery") \ 192 | X(Zerg_Expansion, (const char*) "Zerg_Expansion") \ 193 | X(Zerg_Expansion2, (const char*) "Zerg_Expansion2") \ 194 | X(Zerg_Infested_Command_Center, (const char*) "Zerg_Infested_Command_Center") \ 195 | X(Zerg_Lair, (const char*) "Zerg_Lair") \ 196 | X(Zerg_Hive, (const char*) "Zerg_Hive") \ 197 | X(Zerg_Nydus_Canal, (const char*) "Zerg_Nydus_Canal") \ 198 | X(Zerg_Hydralisk_Den, (const char*) "Zerg_Hydralisk_Den") \ 199 | X(Zerg_Defiler_Mound, (const char*) "Zerg_Defiler_Mound") \ 200 | X(Zerg_Greater_Spire, (const char*) "Zerg_Greater_Spire") \ 201 | X(Zerg_Queens_Nest, (const char*) "Zerg_Queens_Nest") \ 202 | X(Zerg_Evolution_Chamber, (const char*) "Zerg_Evolution_Chamber") \ 203 | X(Zerg_Ultralisk_Cavern, (const char*) "Zerg_Ultralisk_Cavern") \ 204 | X(Zerg_Spire, (const char*) "Zerg_Spire") \ 205 | X(Zerg_Spawning_Pool, (const char*) "Zerg_Spawning_Pool") \ 206 | X(Zerg_Creep_Colony, (const char*) "Zerg_Creep_Colony") \ 207 | X(Zerg_Spore_Colony, (const char*) "Zerg_Spore_Colony") \ 208 | X(Zerg_Sunken_Colony, (const char*) "Zerg_Sunken_Colony") \ 209 | X(Zerg_Extractor, (const char*) "Zerg_Extractor")\ 210 | \ 211 | X(Zerg_Building_Overlord, (const char*) "Zerg_Building_Overlord") \ 212 | 213 | #define X(a, b) a, 214 | enum Zerg_Buildings 215 | { 216 | ZERG_X_BUILDINGS 217 | }; 218 | #undef X 219 | 220 | #define X(a, b) b, 221 | const char* zerg_buildings_name[] = 222 | { 223 | ZERG_X_BUILDINGS 224 | }; 225 | #undef X 226 | 227 | #define NB_ZERG_BUILDINGS 20 // 17 buildings + overlord + expand + expand2 228 | 229 | enum Spells 230 | { 231 | Spell_Scanner_Sweep, 232 | Spell_Disruption_Web, 233 | Spell_Dark_Swarm 234 | }; 235 | 236 | class Building 237 | /// Not happy with this class 238 | { 239 | friend std::ostream& operator <<(std::ostream& os, const Building& b); 240 | int _enumValue; 241 | int _tableSize; 242 | const char** _nameTable; 243 | public: 244 | Building(Protoss_Buildings v) 245 | : _enumValue(v) 246 | , _nameTable(protoss_buildings_name) 247 | , _tableSize(NB_PROTOSS_BUILDINGS) 248 | { 249 | } 250 | Building(Terran_Buildings v) 251 | : _enumValue(v) 252 | , _nameTable(terran_buildings_name) 253 | , _tableSize(NB_TERRAN_BUILDINGS) 254 | { 255 | } 256 | Building(Zerg_Buildings v) 257 | : _enumValue(v) 258 | , _nameTable(zerg_buildings_name) 259 | , _tableSize(NB_ZERG_BUILDINGS) 260 | { 261 | } 262 | Building(const char* buildingName) 263 | { 264 | if (buildingName[0] == 'P') 265 | { 266 | _tableSize = NB_PROTOSS_BUILDINGS; 267 | _nameTable = protoss_buildings_name; 268 | } 269 | else if (buildingName[0] == 'T') 270 | { 271 | _tableSize = NB_TERRAN_BUILDINGS; 272 | _nameTable = terran_buildings_name; 273 | } 274 | else if (buildingName[0] == 'Z') 275 | { 276 | _tableSize = NB_ZERG_BUILDINGS; 277 | _nameTable = zerg_buildings_name; 278 | } 279 | else 280 | { 281 | std::cout << 282 | "ERROR: Building constructor failed to determine the race -> " 283 | << std::string(buildingName) 284 | << std::endl; 285 | } 286 | for (unsigned int i = 0; i < _tableSize; i++) 287 | { 288 | if (!strcmp(buildingName, _nameTable[i])) 289 | { 290 | _enumValue = i; 291 | return; 292 | } 293 | } 294 | std::cout << "ERROR: not found this building: " 295 | << "|" << std::string(buildingName) << "|" 296 | << std::endl; 297 | } 298 | std::ostream& operator <<(std::ostream& os) const 299 | { 300 | if (_enumValue < _tableSize) 301 | os << std::string(_nameTable[_enumValue]); 302 | else 303 | os << "ERROR: _enumValue too big: " << _enumValue; 304 | return os; 305 | } 306 | int getEnumValue() const 307 | { 308 | return _enumValue; 309 | } 310 | }; 311 | inline std::ostream& operator <<(std::ostream& os, const Building& b) 312 | { 313 | if (b._enumValue < b._tableSize) 314 | os << std::string(b._nameTable[b._enumValue]); 315 | else 316 | os << "ERROR: _enumValue too big: " << b._enumValue; 317 | return os; 318 | } 319 | 320 | struct tree_node 321 | { 322 | int value; 323 | std::map children; 324 | void append(int v) 325 | { 326 | children.insert(std::make_pair(v, new tree_node(v))); 327 | } 328 | void append(tree_node* tn) 329 | { 330 | children.insert(std::make_pair(tn->value, tn)); 331 | } 332 | tree_node(int v): value(v) {} 333 | tree_node(const char* p) : value(Protoss_Nexus) // root 334 | { 335 | if (p[0] == 'P') 336 | { 337 | this->append(Protoss_Nexus); 338 | this->append(Protoss_Expansion); 339 | this->append(Protoss_Pylon); 340 | this->append(Protoss_Pylon2); 341 | this->append(Protoss_Assimilator); 342 | this->append(Protoss_Gateway); 343 | this->append(Protoss_Gateway2); 344 | this->append(Protoss_Forge); 345 | children[Protoss_Forge]->append(Protoss_Photon_Cannon); 346 | children[Protoss_Gateway]->append(Protoss_Shield_Battery); 347 | children[Protoss_Gateway]->append(Protoss_Cybernetics_Core); 348 | children[Protoss_Gateway]->children[Protoss_Cybernetics_Core]-> 349 | append(Protoss_Stargate); 350 | children[Protoss_Gateway]->children[Protoss_Cybernetics_Core]-> 351 | append(Protoss_Citadel_of_Adun); 352 | children[Protoss_Gateway]->children[Protoss_Cybernetics_Core]-> 353 | append(Protoss_Robotics_Facility); 354 | children[Protoss_Gateway]->children[Protoss_Cybernetics_Core]-> 355 | children[Protoss_Robotics_Facility]-> 356 | append(Protoss_Robotics_Support_Bay); 357 | children[Protoss_Gateway]->children[Protoss_Cybernetics_Core]-> 358 | children[Protoss_Robotics_Facility]->append(Protoss_Observatory); 359 | children[Protoss_Gateway]->children[Protoss_Cybernetics_Core]-> 360 | children[Protoss_Citadel_of_Adun]-> 361 | append(Protoss_Templar_Archives); 362 | children[Protoss_Gateway]->children[Protoss_Cybernetics_Core]-> 363 | children[Protoss_Stargate]->append(Protoss_Fleet_Beacon); 364 | tree_node* tribunal = new tree_node(Protoss_Arbiter_Tribunal); 365 | children[Protoss_Gateway]->children[Protoss_Cybernetics_Core]-> 366 | children[Protoss_Citadel_of_Adun]-> 367 | children[Protoss_Templar_Archives]->append(tribunal); 368 | children[Protoss_Gateway]->children[Protoss_Cybernetics_Core]-> 369 | children[Protoss_Stargate]->append(tribunal); 370 | } 371 | else if (p[0] == 'T') 372 | { 373 | this->append(Terran_Command_Center); 374 | this->append(Terran_Expansion); 375 | this->append(Terran_Comsat_Station); 376 | this->append(Terran_Nuclear_Silo); 377 | this->append(Terran_Supply_Depot); 378 | this->append(Terran_Refinery); 379 | this->append(Terran_Barracks); 380 | this->append(Terran_Barracks2); 381 | this->append(Terran_Engineering_Bay); 382 | children[Terran_Engineering_Bay]->append(Terran_Missile_Turret); 383 | children[Terran_Barracks]->append(Terran_Academy); 384 | children[Terran_Barracks]->append(Terran_Factory); 385 | children[Terran_Barracks]->append(Terran_Bunker); 386 | children[Terran_Barracks]->children[Terran_Factory]-> 387 | append(Terran_Starport); 388 | children[Terran_Barracks]->children[Terran_Factory]-> 389 | append(Terran_Armory); 390 | children[Terran_Barracks]->children[Terran_Factory]-> 391 | append(Terran_Machine_Shop); 392 | children[Terran_Barracks]->children[Terran_Factory]-> 393 | children[Terran_Starport]->append(Terran_Control_Tower); 394 | children[Terran_Barracks]->children[Terran_Factory]-> 395 | children[Terran_Starport]->append(Terran_Science_Facility); 396 | children[Terran_Barracks]->children[Terran_Factory]-> 397 | children[Terran_Starport]->children[Terran_Science_Facility]-> 398 | append(Terran_Covert_Ops); 399 | children[Terran_Barracks]->children[Terran_Factory]-> 400 | children[Terran_Starport]->children[Terran_Science_Facility]-> 401 | append(Terran_Physics_Lab); 402 | } 403 | else if (p[0] == 'Z') 404 | { 405 | this->append(Zerg_Hatchery); 406 | this->append(Zerg_Expansion); 407 | this->append(Zerg_Expansion2); 408 | this->append(Zerg_Evolution_Chamber); 409 | this->append(Zerg_Infested_Command_Center); 410 | this->append(Zerg_Spawning_Pool); 411 | this->append(Zerg_Creep_Colony); 412 | this->append(Zerg_Extractor); 413 | this->append(Zerg_Building_Overlord); 414 | children[Zerg_Evolution_Chamber]->append(Zerg_Spore_Colony); 415 | children[Zerg_Spawning_Pool]->append(Zerg_Sunken_Colony); 416 | children[Zerg_Spawning_Pool]->append(Zerg_Hydralisk_Den); 417 | children[Zerg_Hatchery]->append(Zerg_Lair); 418 | children[Zerg_Spawning_Pool]->append(children[Zerg_Hatchery]-> 419 | children[Zerg_Lair]); 420 | children[Zerg_Hatchery]->children[Zerg_Lair]-> 421 | append(Zerg_Spire); 422 | children[Zerg_Hatchery]->children[Zerg_Lair]-> 423 | append(Zerg_Queens_Nest); 424 | children[Zerg_Hatchery]->children[Zerg_Lair]->append(Zerg_Hive); 425 | children[Zerg_Hatchery]->children[Zerg_Lair]-> 426 | children[Zerg_Queens_Nest]->append(children[Zerg_Hatchery]-> 427 | children[Zerg_Lair]->children[Zerg_Hive]); 428 | children[Zerg_Hatchery]->children[Zerg_Lair]->children[Zerg_Hive] 429 | ->append(Zerg_Nydus_Canal); 430 | children[Zerg_Hatchery]->children[Zerg_Lair]->children[Zerg_Hive] 431 | ->append(Zerg_Defiler_Mound); 432 | tree_node* gspire = new tree_node(Zerg_Greater_Spire); 433 | children[Zerg_Hatchery]->children[Zerg_Lair]->children[Zerg_Hive] 434 | ->append(gspire); 435 | children[Zerg_Hatchery]->children[Zerg_Lair]->children[Zerg_Spire] 436 | ->append(gspire); 437 | children[Zerg_Hatchery]->children[Zerg_Lair]->children[Zerg_Hive] 438 | ->append(Zerg_Ultralisk_Cavern); 439 | } 440 | } 441 | ~tree_node() 442 | { 443 | for (std::map::iterator it = children.begin(); 444 | it != children.end(); ++it) 445 | { 446 | if (it->second != NULL) 447 | delete it->second; 448 | } 449 | } 450 | }; 451 | 452 | #endif 453 | -------------------------------------------------------------------------------- /enums_name_tables_tt.h: -------------------------------------------------------------------------------- 1 | #ifndef ENUMS_NAME_TABLES 2 | #define ENUMS_NAME_TABLES 3 | 4 | #include 5 | #include 6 | 7 | /// Copyright Gabriel Synnaeve 2011 8 | /// This code is under 3-clauses (new) BSD License 9 | 10 | #define TERRAN_X_UNITS \ 11 | X(Terran_Marine, (const char*) "Terran_Marine") \ 12 | X(Terran_Ghost, (const char*) "Terran_Ghost") \ 13 | X(Terran_Vulture, (const char*) "Terran_Vulture") \ 14 | X(Terran_Goliath, (const char*) "Terran_Goliath") \ 15 | X(Terran_Siege, (const char*) "Terran_Siege_Tank") \ 16 | X(Terran_SCV, (const char*) "Terran_SCV") \ 17 | X(Terran_Wraith, (const char*) "Terran_Wraith") \ 18 | X(Terran_Science_Vessel, (const char*) "Terran_Science_Vessel") \ 19 | X(Terran_Dropship, (const char*) "Terran_Dropship") \ 20 | X(Terran_Battlecruiser, (const char*) "Terran_Battlecruiser") \ 21 | X(Terran_Vulture_Spider_Mine, (const char*) "Terran_Vulture_Spider_Mine") \ 22 | X(Terran_Nuclear_Missile, (const char*) "Terran_Nuclear_Missile") \ 23 | X(Terran_Siege_Tank_Siege_Mode, (const char*) "Terran_Siege_Tank_Siege_Mode") \ 24 | X(Terran_Firebat, (const char*) "Terran_Firebat") \ 25 | X(Terran_Medic, (const char*) "Terran_Medic") \ 26 | X(Terran_Valkyrie, (const char*) "Terran_Valkyrie") 27 | 28 | #define X(a, b) a, 29 | enum Terran_Units 30 | { 31 | TERRAN_X_UNITS 32 | }; 33 | #undef X 34 | 35 | #define X(a, b) b, 36 | const char* terran_units_name[] = 37 | { 38 | TERRAN_X_UNITS 39 | }; 40 | #undef X 41 | 42 | #define NB_TERRAN_UNITS 16 43 | 44 | #define TERRAN_X_BUILDINGS \ 45 | X(Terran_Command_Center, (const char*) "Terran_Command_Center") \ 46 | X(Terran_Command_Center2, (const char*) "Terran_Command_Center2") \ 47 | X(Terran_Command_Center3, (const char*) "Terran_Command_Center3") \ 48 | X(Terran_ComSat, (const char*) "Terran_ComSat") \ 49 | X(Terran_Nuclear_Silo, (const char*) "Terran_Nuclear_Silo") \ 50 | X(Terran_Supply_Depot, (const char*) "Terran_Supply_Depot") \ 51 | X(Terran_Supply_Depot2, (const char*) "Terran_Supply_Depot2") \ 52 | X(Terran_Supply_Depot3, (const char*) "Terran_Supply_Depot3") \ 53 | X(Terran_Refinery, (const char*) "Terran_Refinery") \ 54 | X(Terran_Refinery2, (const char*) "Terran_Refinery2") \ 55 | X(Terran_Barracks, (const char*) "Terran_Barracks") \ 56 | X(Terran_Barracks2, (const char*) "Terran_Barracks2") \ 57 | X(Terran_Barracks3, (const char*) "Terran_Barracks3") \ 58 | X(Terran_Barracks4, (const char*) "Terran_Barracks4") \ 59 | X(Terran_Academy, (const char*) "Terran_Academy") \ 60 | X(Terran_Factory, (const char*) "Terran_Factory") \ 61 | X(Terran_Starport, (const char*) "Terran_Starport") \ 62 | X(Terran_Control_Tower, (const char*) "Terran_Control_Tower") \ 63 | X(Terran_Science_Facility, (const char*) "Terran_Science_Facility") \ 64 | X(Terran_Covert_Ops, (const char*) "Terran_Covert_Ops") \ 65 | X(Terran_Physics_Lab, (const char*) "Terran_Physics_Lab") \ 66 | X(Terran_Machine_Shop, (const char*) "Terran_Machine_Shop") \ 67 | X(Terran_Engineering_Bay, (const char*) "Terran_Engineering_Bay") \ 68 | X(Terran_Armory, (const char*) "Terran_Armory") \ 69 | X(Terran_Missile_Turret, (const char*) "Terran_Missile_Turret") \ 70 | X(Terran_Bunker, (const char*) "Terran_Bunker") 71 | 72 | #define X(a, b) a, 73 | enum Terran_Buildings 74 | { 75 | TERRAN_X_BUILDINGS 76 | }; 77 | #undef X 78 | 79 | #define X(a, b) b, 80 | const char* terran_buildings_name[] = 81 | { 82 | TERRAN_X_BUILDINGS 83 | }; 84 | #undef X 85 | 86 | #define NB_TERRAN_BUILDINGS 26 87 | 88 | #define PROTOSS_X_UNITS \ 89 | X(Protoss_Corsair, (const char*) "Protoss_Corsair") \ 90 | X(Protoss_Dark_Templar, (const char*) "Protoss_Dark_Templar") \ 91 | X(Protoss_Dark_Archon, (const char*) "Protoss_Dark_Archon") \ 92 | X(Protoss_Probe, (const char*) "Protoss_Probe") \ 93 | X(Protoss_Zealot, (const char*) "Protoss_Zealot") \ 94 | X(Protoss_Dragoon, (const char*) "Protoss_Dragoon") \ 95 | X(Protoss_High_Templar, (const char*) "Protoss_High_Templar") \ 96 | X(Protoss_Archon, (const char*) "Protoss_Archon") \ 97 | X(Protoss_Shuttle, (const char*) "Protoss_Shuttle") \ 98 | X(Protoss_Scout, (const char*) "Protoss_Scout") \ 99 | X(Protoss_Arbiter, (const char*) "Protoss_Arbiter") \ 100 | X(Protoss_Carrier, (const char*) "Protoss_Carrier") \ 101 | X(Protoss_Interceptor, (const char*) "Protoss_Interceptor") \ 102 | X(Protoss_Reaver, (const char*) "Protoss_Reaver") \ 103 | X(Protoss_Observer, (const char*) "Protoss_Observer") \ 104 | X(Protoss_Scarab, (const char*) "Protoss_Scarab") 105 | 106 | #define X(a, b) a, 107 | enum Protoss_Units 108 | { 109 | PROTOSS_X_UNITS 110 | }; 111 | #undef X 112 | 113 | #define X(a, b) b, 114 | const char* protoss_units_name[] = 115 | { 116 | PROTOSS_X_UNITS 117 | }; 118 | #undef X 119 | 120 | #define NB_PROTOSS_UNITS 16 121 | 122 | #define PROTOSS_X_BUILDINGS \ 123 | X(Protoss_Nexus, (const char*) "Protoss_Nexus") \ 124 | X(Protoss_Nexus2, (const char*) "Protoss_Nexus2") \ 125 | X(Protoss_Nexus3, (const char*) "Protoss_Nexus3") \ 126 | X(Protoss_Robotics_Facility, (const char*) "Protoss_Robotics_Facility") \ 127 | X(Protoss_Pylon, (const char*) "Protoss_Pylon") \ 128 | X(Protoss_Pylon2, (const char*) "Protoss_Pylon2") \ 129 | X(Protoss_Pylon3, (const char*) "Protoss_Pylon3") \ 130 | X(Protoss_Assimilator, (const char*) "Protoss_Assimilator") \ 131 | X(Protoss_Assimilator2, (const char*) "Protoss_Assimilator2") \ 132 | X(Protoss_Observatory, (const char*) "Protoss_Observatory") \ 133 | X(Protoss_Gateway, (const char*) "Protoss_Gateway") \ 134 | X(Protoss_Gateway2, (const char*) "Protoss_Gateway2") \ 135 | X(Protoss_Gateway3, (const char*) "Protoss_Gateway3") \ 136 | X(Protoss_Gateway4, (const char*) "Protoss_Gateway4") \ 137 | X(Protoss_Photon_Cannon, (const char*) "Protoss_Photon_Cannon") \ 138 | X(Protoss_Citadel_of_Adun, (const char*) "Protoss_Citadel_of_Adun") \ 139 | X(Protoss_Cybernetics_Core, (const char*) "Protoss_Cybernetics_Core") \ 140 | X(Protoss_Templar_Archives, (const char*) "Protoss_Templar_Archives") \ 141 | X(Protoss_Forge, (const char*) "Protoss_Forge") \ 142 | X(Protoss_Stargate, (const char*) "Protoss_Stargate") \ 143 | X(Protoss_Fleet_Beacon, (const char*) "Protoss_Fleet_Beacon") \ 144 | X(Protoss_Arbiter_Tribunal, (const char*) "Protoss_Arbiter_Tribunal") \ 145 | X(Protoss_Robotics_Support_Bay, (const char*) "Protoss_Robotics_Support_Bay") \ 146 | X(Protoss_Shield_Battery, (const char*) "Protoss_Shield_Battery") 147 | 148 | #define X(a, b) a, 149 | enum Protoss_Buildings 150 | { 151 | PROTOSS_X_BUILDINGS 152 | }; 153 | #undef X 154 | 155 | #define X(a, b) b, 156 | const char* protoss_buildings_name[] = 157 | { 158 | PROTOSS_X_BUILDINGS 159 | }; 160 | #undef X 161 | 162 | #define NB_PROTOSS_BUILDINGS 24 163 | 164 | #define ZERG_X_UNITS \ 165 | X(Zerg_Larva, (const char*) "Zerg_Larva") \ 166 | X(Zerg_Egg, (const char*) "Zerg_Egg") \ 167 | X(Zerg_Zergling, (const char*) "Zerg_Zergling") \ 168 | X(Zerg_Hydralisk, (const char*) "Zerg_Hydralisk") \ 169 | X(Zerg_Ultralisk, (const char*) "Zerg_Ultralisk") \ 170 | X(Zerg_Broodling, (const char*) "Zerg_Broodling") \ 171 | X(Zerg_Drone, (const char*) "Zerg_Drone") \ 172 | X(Zerg_Mutalisk, (const char*) "Zerg_Mutalisk") \ 173 | X(Zerg_Guardian, (const char*) "Zerg_Guardian") \ 174 | X(Zerg_Queen, (const char*) "Zerg_Queen") \ 175 | X(Zerg_Defiler, (const char*) "Zerg_Defiler") \ 176 | X(Zerg_Scourge, (const char*) "Zerg_Scourge") \ 177 | X(Zerg_Infested_Terran, (const char*) "Zerg_Infested_Terran") \ 178 | X(Zerg_Cocoon, (const char*) "Zerg_Cocoon") \ 179 | X(Zerg_Devourer, (const char*) "Zerg_Devourer") \ 180 | X(Zerg_Lurker_Egg, (const char*) "Zerg_Lurker_Egg") \ 181 | X(Zerg_Lurker, (const char*) "Zerg_Lurker") 182 | 183 | #define X(a, b) a, 184 | enum Zerg_Units 185 | { 186 | ZERG_X_UNITS 187 | }; 188 | #undef X 189 | 190 | #define X(a, b) b, 191 | const char* zerg_units_name[] = 192 | { 193 | ZERG_X_UNITS 194 | }; 195 | #undef X 196 | 197 | #define NB_ZERG_UNITS 17 198 | 199 | #define ZERG_X_BUILDINGS \ 200 | X(Zerg_Hatchery, (const char*) "Zerg_Hatchery") \ 201 | X(Zerg_Hatchery2, (const char*) "Zerg_Hatchery2") \ 202 | X(Zerg_Hatchery3, (const char*) "Zerg_Hatchery3") \ 203 | X(Zerg_Hatchery4, (const char*) "Zerg_Hatchery4") \ 204 | X(Zerg_Lair, (const char*) "Zerg_Lair") \ 205 | X(Zerg_Hive, (const char*) "Zerg_Hive") \ 206 | X(Zerg_Nydus_Canal, (const char*) "Zerg_Nydus_Canal") \ 207 | X(Zerg_Hydralisk_Den, (const char*) "Zerg_Hydralisk_Den") \ 208 | X(Zerg_Defiler_Mound, (const char*) "Zerg_Defiler_Mound") \ 209 | X(Zerg_Greater_Spire, (const char*) "Zerg_Greater_Spire") \ 210 | X(Zerg_Queens_Nest, (const char*) "Zerg_Queens_Nest") \ 211 | X(Zerg_Evolution_Chamber, (const char*) "Zerg_Evolution_Chamber") \ 212 | X(Zerg_Ultralisk_Cavern, (const char*) "Zerg_Ultralisk_Cavern") \ 213 | X(Zerg_Spire, (const char*) "Zerg_Spire") \ 214 | X(Zerg_Spawning_Pool, (const char*) "Zerg_Spawning_Pool") \ 215 | X(Zerg_Creep_Colony, (const char*) "Zerg_Creep_Colony") \ 216 | X(Zerg_Spore_Colony, (const char*) "Zerg_Spore_Colony") \ 217 | X(Zerg_Sunken_Colony, (const char*) "Zerg_Sunken_Colony") \ 218 | X(Zerg_Extractor, (const char*) "Zerg_Extractor")\ 219 | X(Zerg_Extractor2, (const char*) "Zerg_Extractor2")\ 220 | \ 221 | X(Zerg_Overlord, (const char*) "Zerg_Overlord") \ 222 | X(Zerg_Overlord2, (const char*) "Zerg_Overlord2") \ 223 | X(Zerg_Overlord3, (const char*) "Zerg_Overlord3") \ 224 | 225 | #define X(a, b) a, 226 | enum Zerg_Buildings 227 | { 228 | ZERG_X_BUILDINGS 229 | }; 230 | #undef X 231 | 232 | #define X(a, b) b, 233 | const char* zerg_buildings_name[] = 234 | { 235 | ZERG_X_BUILDINGS 236 | }; 237 | #undef X 238 | 239 | #define NB_ZERG_BUILDINGS 24 240 | 241 | enum Spells 242 | { 243 | Spell_Scanner_Sweep, 244 | Spell_Disruption_Web, 245 | Spell_Dark_Swarm 246 | }; 247 | 248 | class Building 249 | /// Not happy with this class 250 | { 251 | friend std::ostream& operator <<(std::ostream& os, const Building& b); 252 | int _enumValue; 253 | int _tableSize; 254 | const char** _nameTable; 255 | public: 256 | Building(Protoss_Buildings v) 257 | : _enumValue(v) 258 | , _nameTable(protoss_buildings_name) 259 | , _tableSize(NB_PROTOSS_BUILDINGS) 260 | { 261 | } 262 | Building(Terran_Buildings v) 263 | : _enumValue(v) 264 | , _nameTable(terran_buildings_name) 265 | , _tableSize(NB_TERRAN_BUILDINGS) 266 | { 267 | } 268 | Building(Zerg_Buildings v) 269 | : _enumValue(v) 270 | , _nameTable(zerg_buildings_name) 271 | , _tableSize(NB_ZERG_BUILDINGS) 272 | { 273 | } 274 | Building(const char* buildingName) 275 | { 276 | if (buildingName[0] == 'P') 277 | { 278 | _tableSize = NB_PROTOSS_BUILDINGS; 279 | _nameTable = protoss_buildings_name; 280 | } 281 | else if (buildingName[0] == 'T') 282 | { 283 | _tableSize = NB_TERRAN_BUILDINGS; 284 | _nameTable = terran_buildings_name; 285 | } 286 | else if (buildingName[0] == 'Z') 287 | { 288 | _tableSize = NB_ZERG_BUILDINGS; 289 | _nameTable = zerg_buildings_name; 290 | } 291 | else 292 | { 293 | std::cout << 294 | "ERROR: Building constructor failed to determine the race -> " 295 | << std::string(buildingName) 296 | << std::endl; 297 | } 298 | for (unsigned int i = 0; i < _tableSize; i++) 299 | { 300 | if (!strcmp(buildingName, _nameTable[i])) 301 | { 302 | _enumValue = i; 303 | return; 304 | } 305 | } 306 | std::cout << "ERROR: not found this building: " 307 | << "|" << std::string(buildingName) << "|" 308 | << std::endl; 309 | } 310 | std::ostream& operator <<(std::ostream& os) const 311 | { 312 | if (_enumValue < _tableSize) 313 | os << std::string(_nameTable[_enumValue]); 314 | else 315 | os << "ERROR: _enumValue too big: " << _enumValue; 316 | return os; 317 | } 318 | int getEnumValue() const 319 | { 320 | return _enumValue; 321 | } 322 | }; 323 | inline std::ostream& operator <<(std::ostream& os, const Building& b) 324 | { 325 | if (b._enumValue < b._tableSize) 326 | os << std::string(b._nameTable[b._enumValue]); 327 | else 328 | os << "ERROR: _enumValue too big: " << b._enumValue; 329 | return os; 330 | } 331 | 332 | struct tree_node 333 | { 334 | int value; 335 | std::map children; 336 | void append(int v) 337 | { 338 | children.insert(std::make_pair(v, new tree_node(v))); 339 | } 340 | void append(tree_node* tn) 341 | { 342 | children.insert(std::make_pair(tn->value, tn)); 343 | } 344 | tree_node(int v): value(v) {} 345 | tree_node(const char* p) : value(Protoss_Nexus) // root 346 | { 347 | if (p[0] == 'P') 348 | { 349 | this->append(Protoss_Nexus); 350 | this->append(Protoss_Nexus2); 351 | this->append(Protoss_Nexus3); 352 | this->append(Protoss_Pylon); 353 | this->append(Protoss_Pylon2); 354 | this->append(Protoss_Pylon3); 355 | this->append(Protoss_Assimilator); 356 | this->append(Protoss_Assimilator2); 357 | this->append(Protoss_Gateway); 358 | this->append(Protoss_Gateway2); 359 | this->append(Protoss_Gateway3); 360 | this->append(Protoss_Gateway4); 361 | this->append(Protoss_Forge); 362 | children[Protoss_Forge]->append(Protoss_Photon_Cannon); 363 | children[Protoss_Gateway]->append(Protoss_Shield_Battery); 364 | children[Protoss_Gateway]->append(Protoss_Cybernetics_Core); 365 | children[Protoss_Gateway]->children[Protoss_Cybernetics_Core]-> 366 | append(Protoss_Stargate); 367 | children[Protoss_Gateway]->children[Protoss_Cybernetics_Core]-> 368 | append(Protoss_Citadel_of_Adun); 369 | children[Protoss_Gateway]->children[Protoss_Cybernetics_Core]-> 370 | append(Protoss_Robotics_Facility); 371 | children[Protoss_Gateway]->children[Protoss_Cybernetics_Core]-> 372 | children[Protoss_Robotics_Facility]-> 373 | append(Protoss_Robotics_Support_Bay); 374 | children[Protoss_Gateway]->children[Protoss_Cybernetics_Core]-> 375 | children[Protoss_Robotics_Facility]->append(Protoss_Observatory); 376 | children[Protoss_Gateway]->children[Protoss_Cybernetics_Core]-> 377 | children[Protoss_Citadel_of_Adun]-> 378 | append(Protoss_Templar_Archives); 379 | children[Protoss_Gateway]->children[Protoss_Cybernetics_Core]-> 380 | children[Protoss_Stargate]->append(Protoss_Fleet_Beacon); 381 | tree_node* tribunal = new tree_node(Protoss_Arbiter_Tribunal); 382 | children[Protoss_Gateway]->children[Protoss_Cybernetics_Core]-> 383 | children[Protoss_Citadel_of_Adun]-> 384 | children[Protoss_Templar_Archives]->append(tribunal); 385 | children[Protoss_Gateway]->children[Protoss_Cybernetics_Core]-> 386 | children[Protoss_Stargate]->append(tribunal); 387 | } 388 | else if (p[0] == 'T') 389 | { 390 | this->append(Terran_Command_Center); 391 | this->append(Terran_Command_Center2); 392 | this->append(Terran_Command_Center3); 393 | this->append(Terran_ComSat); 394 | this->append(Terran_Nuclear_Silo); 395 | this->append(Terran_Supply_Depot); 396 | this->append(Terran_Supply_Depot2); 397 | this->append(Terran_Supply_Depot3); 398 | this->append(Terran_Refinery); 399 | this->append(Terran_Refinery2); 400 | this->append(Terran_Barracks); 401 | this->append(Terran_Barracks2); 402 | this->append(Terran_Barracks3); 403 | this->append(Terran_Barracks4); 404 | this->append(Terran_Engineering_Bay); 405 | children[Terran_Engineering_Bay]->append(Terran_Missile_Turret); 406 | children[Terran_Barracks]->append(Terran_Academy); 407 | children[Terran_Barracks]->append(Terran_Factory); 408 | children[Terran_Barracks]->append(Terran_Bunker); 409 | children[Terran_Barracks]->children[Terran_Factory]-> 410 | append(Terran_Starport); 411 | children[Terran_Barracks]->children[Terran_Factory]-> 412 | append(Terran_Armory); 413 | children[Terran_Barracks]->children[Terran_Factory]-> 414 | append(Terran_Machine_Shop); 415 | children[Terran_Barracks]->children[Terran_Factory]-> 416 | children[Terran_Starport]->append(Terran_Control_Tower); 417 | children[Terran_Barracks]->children[Terran_Factory]-> 418 | children[Terran_Starport]->append(Terran_Science_Facility); 419 | children[Terran_Barracks]->children[Terran_Factory]-> 420 | children[Terran_Starport]->children[Terran_Science_Facility]-> 421 | append(Terran_Covert_Ops); 422 | children[Terran_Barracks]->children[Terran_Factory]-> 423 | children[Terran_Starport]->children[Terran_Science_Facility]-> 424 | append(Terran_Physics_Lab); 425 | } 426 | else if (p[0] == 'Z') 427 | { 428 | this->append(Zerg_Hatchery); 429 | this->append(Zerg_Hatchery2); 430 | this->append(Zerg_Hatchery3); 431 | this->append(Zerg_Hatchery4); 432 | this->append(Zerg_Evolution_Chamber); 433 | this->append(Zerg_Spawning_Pool); 434 | this->append(Zerg_Creep_Colony); 435 | this->append(Zerg_Extractor); 436 | this->append(Zerg_Extractor2); 437 | this->append(Zerg_Overlord); 438 | this->append(Zerg_Overlord2); 439 | this->append(Zerg_Overlord3); 440 | children[Zerg_Evolution_Chamber]->append(Zerg_Spore_Colony); 441 | children[Zerg_Spawning_Pool]->append(Zerg_Sunken_Colony); 442 | children[Zerg_Spawning_Pool]->append(Zerg_Hydralisk_Den); 443 | children[Zerg_Hatchery]->append(Zerg_Lair); 444 | children[Zerg_Spawning_Pool]->append(children[Zerg_Hatchery]-> 445 | children[Zerg_Lair]); 446 | children[Zerg_Hatchery]->children[Zerg_Lair]-> 447 | append(Zerg_Spire); 448 | children[Zerg_Hatchery]->children[Zerg_Lair]-> 449 | append(Zerg_Queens_Nest); 450 | children[Zerg_Hatchery]->children[Zerg_Lair]->append(Zerg_Hive); 451 | children[Zerg_Hatchery]->children[Zerg_Lair]-> 452 | children[Zerg_Queens_Nest]->append(children[Zerg_Hatchery]-> 453 | children[Zerg_Lair]->children[Zerg_Hive]); 454 | children[Zerg_Hatchery]->children[Zerg_Lair]->children[Zerg_Hive] 455 | ->append(Zerg_Nydus_Canal); 456 | children[Zerg_Hatchery]->children[Zerg_Lair]->children[Zerg_Hive] 457 | ->append(Zerg_Defiler_Mound); 458 | tree_node* gspire = new tree_node(Zerg_Greater_Spire); 459 | children[Zerg_Hatchery]->children[Zerg_Lair]->children[Zerg_Hive] 460 | ->append(gspire); 461 | children[Zerg_Hatchery]->children[Zerg_Lair]->children[Zerg_Spire] 462 | ->append(gspire); 463 | children[Zerg_Hatchery]->children[Zerg_Lair]->children[Zerg_Hive] 464 | ->append(Zerg_Ultralisk_Cavern); 465 | } 466 | } 467 | ~tree_node() 468 | { 469 | for (std::map::iterator it = children.begin(); 470 | it != children.end(); ++it) 471 | { 472 | if (it->second != NULL) 473 | delete it->second; 474 | } 475 | } 476 | }; 477 | 478 | #endif 479 | -------------------------------------------------------------------------------- /model.h: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include "x_values.h" 8 | #include "enums_name_tables.h" 9 | #include "replays.h" 10 | #include "parameters.h" 11 | #include 12 | #include 13 | #include 14 | #include 15 | 16 | /// Copyright Gabriel Synnaeve 2011 17 | /// This code is under 3-clauses (new) BSD License 18 | 19 | typedef void iovoid; 20 | 21 | class OpeningPredictor 22 | { 23 | std::vector openings; 24 | /// Variables specification 25 | plSymbol X; 26 | std::vector observed; 27 | plSymbol lambda; 28 | plSymbol Opening; 29 | #ifdef DIRAC_ON_LAST_OPENING 30 | plSymbol LastOpening; 31 | #endif 32 | plSymbol Time; 33 | /// Parametric forms specification 34 | std::vector tableOpening; 35 | #ifdef DIRAC_ON_LAST_OPENING 36 | plMutableDistribution P_LastOpening; 37 | plExternalFunction same_opening; 38 | plFunctionalDirac P_Opening; 39 | #else 40 | plProbTable P_Opening; 41 | #endif 42 | plCndLearnObject xLearner; 43 | plProbTable P_X; 44 | plComputableObjectList listObs; 45 | std::vector P_Observed; 46 | plVariablesConjunction ObsConj; 47 | plVariablesConjunction X_Obs_conj; 48 | plExternalFunction coherence; 49 | plFunctionalDirac P_lambda; 50 | #ifdef LAPLACE_LEARNING 51 | plCndLearnObject timeLearner; 52 | #else 53 | plCndLearnObject timeLearner; 54 | #endif 55 | #ifdef __MIN_STD_DEV_BELL_SHAPES__ 56 | plDistributionMap time_knowing_x_op; 57 | #endif 58 | /// Decomposition 59 | plVariablesConjunction knownConj; 60 | plJointDistribution jd; 61 | /// Program Question 62 | #if PLOT > 1 63 | plVariablesConjunction X_Op; 64 | plCndDistribution Cnd_P_Time_X_knowing_Op; 65 | #if PLOT > 2 66 | plCndDistribution Cnd_P_Time_knowing_X_Op; 67 | #endif 68 | #endif 69 | #ifdef TECH_TREES 70 | plCndDistribution Cnd_P_X_knowing_obs; 71 | #endif 72 | plCndDistribution Cnd_P_Opening_knowing_rest; 73 | 74 | #ifdef BENCH 75 | unsigned int positive_classif_finale; 76 | unsigned int positive_classif_online; 77 | unsigned int positive_classif_online_after; 78 | unsigned int cpositive_classif_finale; 79 | std::map cumulative_prob; 80 | #ifdef TECH_TREES 81 | std::vector old_T_P_X; 82 | std::set current_x; 83 | int save_nbinferences; 84 | double tmeanc_set_distance_X; // current 85 | double tbestc_set_distance_X; // current 86 | double tmeanc_tree_distance_X; // current 87 | double tbestc_tree_distance_X; // current 88 | double tmeanp_set_distance_X; // prediction 89 | double tbestp_set_distance_X; // prediction 90 | double tmeanp_tree_distance_X; // prediction 91 | double tbestp_tree_distance_X; // prediction 92 | double tprediction_best_set_X; 93 | double tprediction_mean_set_X; 94 | 95 | std::vector meanc_set_distance_X; 96 | std::vector bestc_set_distance_X; 97 | std::vector meanc_tree_distance_X; 98 | std::vector bestc_tree_distance_X; 99 | std::vector meanp_set_distance_X; 100 | std::vector bestp_set_distance_X; 101 | std::vector meanp_tree_distance_X; 102 | std::vector bestp_tree_distance_X; 103 | std::vector prediction_best_set_X; 104 | std::vector prediction_mean_set_X; 105 | #endif 106 | unsigned int times_label_predicted; 107 | unsigned int times_label_predicted_after; 108 | std::vector time_taken_prediction; 109 | #endif 110 | 111 | // Game wise computations 112 | plValues evidence; 113 | int nbinferences; 114 | #if PLOT > 0 115 | std::vector > T_P_Opening_v; 116 | #ifdef TECH_TREES 117 | std::vector > T_P_X_v; 118 | #endif 119 | std::vector tmpProbV; 120 | #endif 121 | 122 | std::vector prior_openings(char them, char us); 123 | 124 | public: 125 | #ifdef TECH_TREES 126 | plDistribution T_P_X; 127 | #endif 128 | plDistribution T_P_Opening; 129 | OpeningPredictor(const std::vector& op, 130 | const char* learningFileName); 131 | ~OpeningPredictor(); 132 | void init_game(); 133 | int instantiate_and_compile(int time, 134 | const Building& building, const std::string& tmpOpening); 135 | int quit_game(const std::string& tmpOpening, int noreplay); 136 | void results(int noreplay); 137 | }; 138 | -------------------------------------------------------------------------------- /model.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syhw/OpeningTech/296ac9b012a99d4de5d29cbf2747f6474776f3ed/model.pdf -------------------------------------------------------------------------------- /noisy.sh: -------------------------------------------------------------------------------- 1 | echo "" 2 | echo "BW labels, noise $1:" 3 | for name in [TPZ]v[TPZ].txt 4 | do 5 | echo ${name%.*} 6 | ./model l$name t${name%.*}n$1.txt | grep ">>> Positive classif" 7 | done 8 | echo "" 9 | echo "MY labels, noise $1" 10 | for name in [TPZ]v[TPZ]x.txt 11 | do 12 | echo ${name%.*} 13 | ./mymodel l$name t${name%.*}n$1.txt | grep ">>> Positive classif" 14 | done 15 | -------------------------------------------------------------------------------- /parameters.h: -------------------------------------------------------------------------------- 1 | #ifndef PARAMETERS_HEADER 2 | #define PARAMETERS_HEADER 3 | 4 | #define X_KNOWING_OPENING 5 | #define DIRAC_ON_LAST_OPENING 6 | //#define LAPLACE_LEARNING // learning histograms with laplace smoothing 7 | 8 | #define LEARN_TIME_LIMIT 1080 // 18 minutes, TODO change 9 | //#define LEARN_TIME_LIMIT 900 // 15 minutes 10 | //#define LEARN_TIME_LIMIT 600 // 10 minutes 11 | //#define GENERATE_X_VALUES 12 | //#define DEBUG_OUTPUT 1 13 | //#define TECH_TREES 14 | //#define __SERIALIZE__ 15 | #ifndef LAPLACE_LEARNING 16 | #define __MIN_STD_DEV_BELL_SHAPES__ // impose minimum standard deviations 17 | #endif 18 | /** 19 | * PLOT = 0 => no plotting 20 | * PLOT = 1 => plot P(Opening) over buildings seen for each replay 21 | * PLOT = 2 => adds plot P(Time,X|Opening) 22 | * PLOT = 3 => adds plot P(Time|X,Opening) 23 | */ 24 | //#define PLOT_ONLY 25 | #define PLOT 1 26 | 27 | #if DEBUG_OUTPUT > 0 28 | #define ERROR_CHECKS 29 | #endif 30 | #define ERROR_CHECKS // TODO change when probt-users will have answered 31 | #define BENCH 32 | 33 | //#define MY_OPENINGS_LABELS 34 | //#define WITH_OPENINGS_PRIOR 35 | #ifndef MY_OPENINGS_LABELS 36 | #undef WITH_OPENINGS_PRIOR 37 | #endif 38 | 39 | #endif 40 | -------------------------------------------------------------------------------- /plot_all_Time_per_Opening_and_X.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | gnuplot *[0-9].gnuplot 3 | -------------------------------------------------------------------------------- /replays.h: -------------------------------------------------------------------------------- 1 | #ifndef REPLAYS 2 | #define REPLAYS 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include "x_values.h" 8 | 9 | /// Copyright Gabriel Synnaeve 2011 10 | /// This code is under 3-clauses (new) BSD License 11 | 12 | std::string pruneOpeningVal(std::string& input) 13 | { 14 | // get 15 | std::string::size_type loc = input.find("Protoss_Opening"); 16 | if (loc == std::string::npos) 17 | loc = input.find("Zerg_Opening"); 18 | if (loc == std::string::npos) 19 | loc = input.find("Terran_Opening"); 20 | if (loc == std::string::npos) 21 | { 22 | std::cout << "ERROR: no Opening label" << std::endl; 23 | return ""; 24 | } 25 | std::string::size_type begin = input.find_first_of(' ', loc); 26 | std::string::size_type end = input.find_first_of(';', begin); 27 | if (begin == std::string::npos || end == std::string::npos) 28 | { 29 | std::cout << "ERROR: bad Opening label formatting" << std::endl; 30 | return ""; 31 | } 32 | std::string r = input.substr(begin+1, end-begin-1); 33 | // remove 34 | input.erase(loc, end-loc+1); 35 | return r; 36 | } 37 | 38 | void getBuildings(std::string str, 39 | std::multimap& b, 40 | unsigned int cutoffseconds = 0) 41 | { 42 | while (str.length() > 2) 43 | { 44 | ///std::cout << "STR: " << str << std::endl; 45 | std::string::size_type loc = str.find_first_not_of(' '); 46 | std::string::size_type begin = str.find_first_of(' ', loc); 47 | std::string::size_type end = str.find_first_of(';', begin); 48 | if (end == std::string::npos) 49 | end = str.find_first_of('\n', begin); 50 | ///std::cout << str.substr(begin+1, end-begin-1) << " ::: " 51 | /// << "|" << str.substr(loc, begin-loc) << "|" 52 | /// << " [Begin: " << begin << "]" 53 | /// << " [End: " << end << "]" 54 | /// << std::endl; 55 | Building tmpBuilding(str.substr(loc, begin-loc).c_str()); 56 | if (cutoffseconds == 0 || 57 | atoi(str.substr(begin+1, end-begin-1).c_str()) < cutoffseconds) 58 | b.insert(std::make_pair( 59 | atoi(str.substr(begin+1, end-begin-1).c_str()), 60 | tmpBuilding)); 61 | if (str.length() <= end+1) 62 | str.erase(); 63 | else 64 | str.erase(0, end+1); 65 | } 66 | } 67 | 68 | #endif 69 | -------------------------------------------------------------------------------- /scrapers/GG_rep_dler.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | for ((i = 0; i <= 45648; i++)); 3 | do 4 | wget http://www.gosugamers.net/starcraft/admin/a_replays.php?dl=$i 5 | done 6 | rm index.html* 7 | -------------------------------------------------------------------------------- /scrapers/TL_rep_dler.py: -------------------------------------------------------------------------------- 1 | #!/opt/local/bin/python2.6 2 | 3 | # http://www.teamliquid.net/replay/ 4 | # http://www.gosugamers.net/starcraft/replays/ 5 | import urllib2 6 | 7 | #TEST showing that the redirect works 8 | #url = 'http://www.teamliquid.net/replay/download.php?replay=1801' 9 | #url = 'http://www.gosugamers.net/starcraft/admin/a_replays.php?dl=30084' 10 | #page = urllib2.urlopen(url) 11 | #print page.geturl() 12 | 13 | url = 'http://www.teamliquid.net/replay/download.php?replay=' 14 | for i in range(1964): 15 | try: 16 | page = urllib2.urlopen(url+str(i+1)) 17 | except: 18 | continue 19 | repnamel = page.geturl().split('/') 20 | repname = repnamel[len(repnamel)-1] 21 | file = open('teamliquid/'+repname,"wb") 22 | file.write(page.read()) 23 | print "saved replay ", 24 | print repname 25 | file.close() 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /scripts/cut.py: -------------------------------------------------------------------------------- 1 | 2 | import sys, random 3 | 4 | if len(sys.argv) > 1: 5 | random.seed() 6 | learnfile = "l"+sys.argv[1] 7 | testfile = "t"+sys.argv[1] 8 | l= open(learnfile, 'w') 9 | t= open(testfile, 'w') 10 | for line in open(sys.argv[1]): 11 | if (random.random() < 0.1): 12 | t.write(line) 13 | else: 14 | l.write(line) 15 | l.close() 16 | t.close() 17 | print "wrote: ", learnfile, testfile 18 | sys.exit(0) 19 | 20 | random.seed() 21 | l= open("lPvP.txt", 'w') 22 | t= open("tPvP.txt", 'w') 23 | for line in open("PvP.txt"): 24 | if (random.random() < 0.1): 25 | t.write(line) 26 | else: 27 | l.write(line) 28 | l.close() 29 | t.close() 30 | 31 | random.seed() 32 | l = open("lPvT.txt", 'w') 33 | t = open("tPvT.txt", 'w') 34 | for line in open("PvT.txt"): 35 | if (random.random() < 0.1): 36 | t.write(line) 37 | else: 38 | l.write(line) 39 | l.close() 40 | t.close() 41 | 42 | random.seed() 43 | l = open("lPvZ.txt", 'w') 44 | t = open("tPvZ.txt", 'w') 45 | for line in open("PvZ.txt"): 46 | if (random.random() < 0.1): 47 | t.write(line) 48 | else: 49 | l.write(line) 50 | l.close() 51 | t.close() 52 | 53 | random.seed() 54 | l = open("lTvP.txt", 'w') 55 | t = open("tTvP.txt", 'w') 56 | for line in open("TvP.txt"): 57 | if (random.random() < 0.1): 58 | t.write(line) 59 | else: 60 | l.write(line) 61 | l.close() 62 | t.close() 63 | 64 | random.seed() 65 | l = open("lTvT.txt", 'w') 66 | t = open("tTvT.txt", 'w') 67 | for line in open("TvT.txt"): 68 | if (random.random() < 0.1): 69 | t.write(line) 70 | else: 71 | l.write(line) 72 | l.close() 73 | t.close() 74 | 75 | random.seed() 76 | l = open("lTvZ.txt", 'w') 77 | t = open("tTvZ.txt", 'w') 78 | for line in open("TvZ.txt"): 79 | if (random.random() < 0.1): 80 | t.write(line) 81 | else: 82 | l.write(line) 83 | l.close() 84 | t.close() 85 | 86 | random.seed() 87 | l = open("lZvP.txt", 'w') 88 | t = open("tZvP.txt", 'w') 89 | for line in open("ZvP.txt"): 90 | if (random.random() < 0.1): 91 | t.write(line) 92 | else: 93 | l.write(line) 94 | l.close() 95 | t.close() 96 | 97 | random.seed() 98 | l = open("lZvT.txt", 'w') 99 | t = open("tZvT.txt", 'w') 100 | for line in open("ZvT.txt"): 101 | if (random.random() < 0.1): 102 | t.write(line) 103 | else: 104 | l.write(line) 105 | l.close() 106 | t.close() 107 | 108 | random.seed() 109 | l = open("lZvZ.txt", 'w') 110 | t = open("tZvZ.txt", 'w') 111 | for line in open("ZvZ.txt"): 112 | if (random.random() < 0.1): 113 | t.write(line) 114 | else: 115 | l.write(line) 116 | l.close() 117 | t.close() 118 | -------------------------------------------------------------------------------- /scripts/cut_mines.sh: -------------------------------------------------------------------------------- 1 | for name in `ls [PZT]*x.txt`; do python scripts/cut.py $name; done 2 | -------------------------------------------------------------------------------- /scripts/divise.py: -------------------------------------------------------------------------------- 1 | import sys 2 | divisor = int(sys.argv[1]) 3 | 4 | for line in sys.stdin: 5 | t = line.rstrip('\n').split(' ') 6 | for (i, e) in enumerate(t): 7 | if e and e[0] in '0123456789': 8 | t[i] = e.rstrip(';') 9 | t[i] = int(t[i]) 10 | t[i] /= divisor 11 | t[i] = str(t[i]) + ';' 12 | print ' '.join(t) 13 | 14 | -------------------------------------------------------------------------------- /scripts/noisify.py: -------------------------------------------------------------------------------- 1 | #!/opt/local/bin/python 2 | import sys, random, math 3 | 4 | if len(sys.argv) > 1: 5 | random.seed() 6 | for i in range(1,16): 7 | fil = sys.argv[1].split('.')[0]+'n'+str(i)+'.txt' 8 | f = open(fil, 'w') 9 | for line in open(sys.argv[1]): 10 | elems = line.split(';') 11 | for n in range(i): 12 | ind = int(math.floor(random.uniform(0, len(elems)-1.0))) 13 | if not "Opening" in elems[ind]: 14 | #if not 'T' in elems[ind] or not 'P' in elems[ind]\ 15 | # or not 'Z' in elems[ind]: 16 | if elems[ind] == '' or elems[ind] == ' ': 17 | n -= 1 18 | else: 19 | if '\n' in elems[ind]: 20 | elems[ind-1] = elems[ind-1] + '\n' 21 | elems.pop(ind) 22 | else: 23 | n -= 1 24 | f.write(';'.join(elems)) 25 | f.close() 26 | print "wrote: ", f 27 | else: 28 | print "need one argument file" 29 | 30 | -------------------------------------------------------------------------------- /scripts/noisify.sh: -------------------------------------------------------------------------------- 1 | for name in `ls t[TZP]v[TZP]*.txt`; do python scripts/noisify.py $name; done 2 | -------------------------------------------------------------------------------- /scripts/plot_noise_evolution.py: -------------------------------------------------------------------------------- 1 | import sys, copy 2 | import numpy as np 3 | import matplotlib.pyplot as plt 4 | from scipy import polyfit, polyval 5 | 6 | results = {} 7 | n = 0 8 | first = True 9 | r = [0.0, 0.0, 0.0] 10 | current = '' 11 | 12 | for line in sys.stdin: 13 | if len(line) > 1 and line[1] == 'v': 14 | n = 0 15 | if first: 16 | current = line.rstrip('\n ') 17 | first = False 18 | else: 19 | tmp = copy.deepcopy(r) 20 | if results.has_key(current): 21 | results[current].append(tmp) 22 | else: 23 | results[current] = [tmp] 24 | current = line.rstrip('\n ') 25 | continue 26 | if '0' in line and not 'noise' in line: # not prob to 1.0 :D 27 | l = line.split(' ') 28 | l = l[len(l) - 1] 29 | r[n] = float(l.rstrip('\n ')) 30 | n += 1 31 | tmp = copy.deepcopy(r) 32 | if results.has_key(current): 33 | results[current].append(tmp) 34 | else: 35 | results[current] = [tmp] 36 | current = line.rstrip('\n ') 37 | 38 | #sys.exit(0) 39 | #print results 40 | width = 0.25 41 | for k in results.iterkeys(): 42 | fig = plt.figure() 43 | indrange = range(len(results[k])) 44 | print k 45 | print indrange 46 | ind = np.array(indrange) 47 | ax = fig.add_subplot(111) 48 | threemins = [results[k][i][0] for i in indrange] 49 | positive = [results[k][i][1] for i in indrange] 50 | allgame = [results[k][i][2] for i in indrange] 51 | #xt = polyval(polyfit(indrange, threemins, 4), indrange) 52 | #xp = polyval(polyfit(indrange, positive, 4), indrange) 53 | #xa = polyval(polyfit(indrange, allgame, 4), indrange) 54 | xt = polyval(polyfit(indrange, threemins, 2), indrange) 55 | xp = polyval(polyfit(indrange, positive, 2), indrange) 56 | xa = polyval(polyfit(indrange, allgame, 2), indrange) 57 | #rect0 = ax.bar(ind, threemins, width, color='r') 58 | #rect1 = ax.bar(ind+width+0.05, positive, width, color='g') 59 | #rect2 = ax.bar(ind+2*width+0.1, allgame, width, color='b') 60 | #rect0 = ax.plot(indrange, threemins, 'o-', color='r') 61 | rect0 = ax.plot(indrange, threemins, 'o', ms=8, color='#FF0000', label='online once > 3min') 62 | rect1 = ax.plot(indrange, positive, 's', ms=8, color='#008000', label='online twice') 63 | rect2 = ax.plot(indrange, allgame, '^', ms=8, color='#0000FF', label='final') 64 | rect0 = ax.plot(indrange, xt, 'k--', linewidth=3, color='r', label='OO3') 65 | rect1 = ax.plot(indrange, xp, '-', linewidth=3, color='g', label='OT') 66 | rect2 = ax.plot(indrange, xa, 'k-.', linewidth=3, color='b', label='final') 67 | ax.set_title('prediction probability, test set, ' + k) 68 | plt.legend() 69 | plt.show() 70 | -------------------------------------------------------------------------------- /scripts/transmute.py: -------------------------------------------------------------------------------- 1 | #!/opt/local/bin/python 2 | 3 | """ 4 | 3-clauses BSD licence, 5 | Copyright 2010-2011 Gabriel Synnaeve 6 | 7 | Script that transforms an arff file of SC:BW replays into a txt file 8 | with each line corresponding to a game. 9 | 10 | Usage: 11 | python transmute.py input.arff output.txt 12 | """ 13 | 14 | import sys 15 | 16 | input = open(sys.argv[1], 'r') 17 | output = open(sys.argv[2], 'w') 18 | race = 0 19 | 20 | def adapt(list): 21 | if race == 1: 22 | for i in range(len(list)): 23 | if list[i] == 'ProtossPylon': 24 | list[i] = 'Protoss_Pylon' 25 | continue 26 | if list[i] == 'ProtossSecondPylon': 27 | list[i] = 'Protoss_Pylon2' 28 | continue 29 | if list[i] == 'ProtossFirstExpansion': 30 | list[i] = 'Protoss_Expansion' 31 | continue 32 | if list[i] == 'ProtossRoboBay': 33 | list[i] = 'Protoss_Robotics_Facility' 34 | continue 35 | if list[i] == 'ProtossFirstGas': 36 | list[i] = 'Protoss_Assimilator' 37 | continue 38 | if list[i] == 'ProtossObservatory': 39 | list[i] = 'Protoss_Observatory' 40 | continue 41 | if list[i] == 'ProtossGateway': 42 | list[i] = 'Protoss_Gateway' 43 | continue 44 | if list[i] == 'ProtossSecondGatway': # :) 45 | list[i] = 'Protoss_Gateway2' 46 | continue 47 | if list[i] == 'ProtossCannon': 48 | list[i] = 'Protoss_Photon_Cannon' 49 | continue 50 | if list[i] == 'ProtossCitadel': 51 | list[i] = 'Protoss_Citadel_of_Adun' 52 | continue 53 | if list[i] == 'ProtossCore': 54 | list[i] = 'Protoss_Cybernetics_Core' 55 | continue 56 | if list[i] == 'ProtossArchives': 57 | list[i] = 'Protoss_Templar_Archives' 58 | continue 59 | if list[i] == 'ProtossForge': 60 | list[i] = 'Protoss_Forge' 61 | continue 62 | if list[i] == 'ProtossStargate': 63 | list[i] = 'Protoss_Stargate' 64 | continue 65 | if list[i] == 'ProtossFleetBeason': # lol 66 | list[i] = 'Protoss_Fleet_Beacon' 67 | continue 68 | if list[i] == 'ProtossTribunal': 69 | list[i] = 'Protoss_Arbiter_Tribunal' 70 | continue 71 | if list[i] == 'ProtossRoboSupport': 72 | list[i] = 'Protoss_Robotics_Support_Bay' 73 | continue 74 | #if list[i] == '': 75 | # list[i] = 'Protoss_Shield_Battery' 76 | # continue 77 | if list[i] == 'midBuild': 78 | list[i] = 'Protoss_Opening' 79 | elif race == 2: 80 | for i in range(len(list)): 81 | if list[i] == 'TerranDepot': 82 | list[i] = 'Terran_Supply_Depot' 83 | continue 84 | if list[i] == 'TerranExpansion': 85 | list[i] = 'Terran_Expansion' 86 | continue 87 | if list[i] == 'TerranBarracks': 88 | list[i] = 'Terran_Barracks' 89 | continue 90 | if list[i] == 'TerranSecondBarracks': 91 | list[i] = 'Terran_Barracks2' 92 | continue 93 | if list[i] == 'TerranGas': 94 | list[i] = 'Terran_Refinery' 95 | continue 96 | if list[i] == 'TerranComsat': 97 | list[i] = 'Terran_Comsat_Station' 98 | continue 99 | if list[i] == 'TerranAcademy': 100 | list[i] = 'Terran_Academy' 101 | continue 102 | if list[i] == 'TerranFactory': 103 | list[i] = 'Terran_Factory' 104 | continue 105 | if list[i] == 'TerranStarport': 106 | list[i] = 'Terran_Starport' 107 | continue 108 | if list[i] == 'TerranControlTower': 109 | list[i] = 'Terran_Control_Tower' 110 | continue 111 | if list[i] == 'TerranScienceFacility': 112 | list[i] = 'Terran_Science_Facility' 113 | continue 114 | if list[i] == 'TerranMachineShop': 115 | list[i] = 'Terran_Machine_Shop' 116 | continue 117 | if list[i] == 'TerranEbay': 118 | list[i] = 'Terran_Engineering_Bay' 119 | continue 120 | if list[i] == 'TerranArmory': 121 | list[i] = 'Terran_Armory' 122 | continue 123 | if list[i] == 'TerranTurret': 124 | list[i] = 'Terran_Missile_Turret' 125 | continue 126 | if list[i] == 'TerranBunker': 127 | list[i] = 'Terran_Bunker' 128 | continue 129 | if list[i] == 'midBuild': 130 | list[i] = 'Terran_Opening' 131 | elif race == 3: 132 | for i in range(len(list)): 133 | if list[i] == 'ZergSecondHatch': 134 | list[i] = 'Zerg_Expansion' 135 | continue 136 | if list[i] == 'ZergThirdHatch': 137 | list[i] = 'Zerg_Expansion2' 138 | continue 139 | if list[i] == 'ZergLair': 140 | list[i] = 'Zerg_Lair' 141 | continue 142 | if list[i] == 'ZergHive': 143 | list[i] = 'Zerg_Hive' 144 | continue 145 | if list[i] == 'ZergHydraDen': 146 | list[i] = 'Zerg_Hydralisk_Den' 147 | continue 148 | if list[i] == 'ZergDefilerMound': 149 | list[i] = 'Zerg_Defiler_Mound' 150 | continue 151 | if list[i] == 'ZergGreaterSpire': 152 | list[i] = 'Zerg_Greater_Spire' 153 | continue 154 | if list[i] == 'ZergQueenNest': 155 | list[i] = 'Zerg_Queens_Nest' 156 | continue 157 | if list[i] == 'ZergevoDen': 158 | list[i] = 'Zerg_Evolution_Chamber' 159 | continue 160 | if list[i] == 'ZergUltraliskCavern': 161 | list[i] = 'Zerg_Ultralisk_Cavern' 162 | continue 163 | if list[i] == 'ZergSpire': 164 | list[i] = 'Zerg_Spire' 165 | continue 166 | if list[i] == 'ZergPool': 167 | list[i] = 'Zerg_Spawning_Pool' 168 | continue 169 | if list[i] == 'ZergCreep': 170 | list[i] = 'Zerg_Creep_Colony' 171 | continue 172 | if list[i] == 'ZergSpore': 173 | list[i] = 'Zerg_Spore_Colony' 174 | continue 175 | if list[i] == 'ZergSunken': 176 | list[i] = 'Zerg_Sunken_Colony' 177 | continue 178 | if list[i] == 'ZergGas': 179 | list[i] = 'Zerg_Extractor' 180 | continue 181 | if list[i] == 'ZergOverlord': 182 | list[i] = 'Zerg_Building_Overlord' 183 | continue 184 | if list[i] == 'midBuild': 185 | list[i] = 'Zerg_Opening' 186 | 187 | lookup = [] 188 | games = [] 189 | data = 0 190 | for line in input: 191 | if race == 0: 192 | if "Protoss" in line: 193 | race = 1 194 | elif "Terran" in line: 195 | race = 2 196 | elif "Zerg" in line: 197 | race = 3 198 | if data: 199 | game = {} 200 | l = line.split(',') 201 | for i in range(len(l)): 202 | game[lookup[i]] = l[i].rstrip('\n\r') 203 | games.append(game) 204 | else: 205 | if '@ATTRIBUTE' in line or '@attribute' in line: 206 | lookup.append(line.split(' ')[1]) 207 | if '@DATA' in line or '@data' in line: 208 | adapt(lookup) 209 | data = 1 210 | input.close() 211 | 212 | for game in games: 213 | for (k,v) in game.iteritems(): 214 | if '_' in k: 215 | if "Opening" in k: 216 | output.write("%s %s; " % (k, v)) 217 | else: 218 | val = int(v)/24 219 | if val > 1079: 220 | val = 0 221 | if val < 0: 222 | val = 0 223 | output.write("%s %s; " % (k, str(val))) 224 | output.write('\n') 225 | output.close() 226 | -------------------------------------------------------------------------------- /scripts/transmute.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | python transmute.py scmPvP_Protoss_Mid.arff PvP.txt 4 | python transmute.py scmPvT_Terran_Mid.arff TvP.txt 5 | python transmute.py scmPvZ_Zerg_Mid.arff ZvP.txt 6 | python transmute.py scmTvZ_Terran_Mid.arff TvZ.txt 7 | python transmute.py scmZvZ_Zerg_Mid.arff ZvZ.txt 8 | python transmute.py scmPvT_Protoss_Mid.arff PvT.txt 9 | python transmute.py scmPvZ_Protoss_Mid.arff PvZ.txt 10 | python transmute.py scmTvT_Terran_Mid.arff TvT.txt 11 | python transmute.py scmTvZ_Zerg_Mid.arff ZvT.txt 12 | cat PvP.txt PvT.txt PvZ.txt > lPall.txt 13 | cat TvP.txt TvT.txt TvZ.txt > lTall.txt 14 | cat ZvP.txt ZvT.txt ZvZ.txt > lZall.txt 15 | cat lPall.txt lTall.txt lZall.txt > full.txt 16 | 17 | -------------------------------------------------------------------------------- /tPvPx.txt: -------------------------------------------------------------------------------- 1 | Protoss_Pylon2 52; Protoss_Pylon 14; Protoss_Opening ; Protoss_Assimilator 32; Protoss_Gateway 42; Protoss_Robotics_Support_Bay 606; Protoss_Expansion 299; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility 545; Protoss_Fleet_Beacon 678; Protoss_Stargate 617; Protoss_Citadel_of_Adun -1; Protoss_Gateway2 55; Protoss_Forge 91; Protoss_Templar_Archives -1; Protoss_Photon_Cannon 121; Protoss_Cybernetics_Core 90; 2 | Protoss_Pylon2 129; Protoss_Pylon 51; Protoss_Opening two_gates; Protoss_Assimilator 100; Protoss_Gateway 82; Protoss_Robotics_Support_Bay -1; Protoss_Expansion -1; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility -1; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun -1; Protoss_Gateway2 166; Protoss_Forge -1; Protoss_Templar_Archives -1; Protoss_Photon_Cannon -1; Protoss_Cybernetics_Core 394; 3 | Protoss_Pylon2 133; Protoss_Pylon 52; Protoss_Opening two_gates; Protoss_Assimilator 156; Protoss_Gateway 82; Protoss_Robotics_Support_Bay -1; Protoss_Expansion 353; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility 379; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun -1; Protoss_Gateway2 109; Protoss_Forge 384; Protoss_Templar_Archives -1; Protoss_Photon_Cannon 415; Protoss_Cybernetics_Core 222; 4 | Protoss_Pylon2 133; Protoss_Pylon 49; Protoss_Opening two_gates; Protoss_Assimilator 147; Protoss_Gateway 76; Protoss_Robotics_Support_Bay 315; Protoss_Expansion 475; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility 247; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun 884; Protoss_Gateway2 100; Protoss_Forge 612; Protoss_Templar_Archives 984; Protoss_Photon_Cannon 670; Protoss_Cybernetics_Core 181; 5 | Protoss_Pylon2 118; Protoss_Pylon 51; Protoss_Opening nony; Protoss_Assimilator 114; Protoss_Gateway 79; Protoss_Robotics_Support_Bay 309; Protoss_Expansion 360; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility 252; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun -1; Protoss_Gateway2 434; Protoss_Forge 503; Protoss_Templar_Archives -1; Protoss_Photon_Cannon -1; Protoss_Cybernetics_Core 167; 6 | Protoss_Pylon2 129; Protoss_Pylon 52; Protoss_Opening two_gates; Protoss_Assimilator 105; Protoss_Gateway 82; Protoss_Robotics_Support_Bay -1; Protoss_Expansion -1; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility 283; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun 478; Protoss_Gateway2 143; Protoss_Forge -1; Protoss_Templar_Archives 523; Protoss_Photon_Cannon -1; Protoss_Cybernetics_Core 238; 7 | Protoss_Pylon2 144; Protoss_Pylon 52; Protoss_Opening two_gates; Protoss_Assimilator 297; Protoss_Gateway 83; Protoss_Robotics_Support_Bay 557; Protoss_Expansion 476; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility 482; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun -1; Protoss_Gateway2 104; Protoss_Forge 0; Protoss_Templar_Archives -1; Protoss_Photon_Cannon -1; Protoss_Cybernetics_Core 340; 8 | Protoss_Pylon2 117; Protoss_Pylon 49; Protoss_Opening two_gates; Protoss_Assimilator 109; Protoss_Gateway 80; Protoss_Robotics_Support_Bay -1; Protoss_Expansion -1; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility -1; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun -1; Protoss_Gateway2 197; Protoss_Forge -1; Protoss_Templar_Archives -1; Protoss_Photon_Cannon -1; Protoss_Cybernetics_Core 169; 9 | Protoss_Pylon2 132; Protoss_Pylon 52; Protoss_Opening two_gates; Protoss_Assimilator 107; Protoss_Gateway 84; Protoss_Robotics_Support_Bay 1066; Protoss_Expansion 552; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility 406; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun 258; Protoss_Gateway2 225; Protoss_Forge 362; Protoss_Templar_Archives 300; Protoss_Photon_Cannon 436; Protoss_Cybernetics_Core 212; 10 | Protoss_Pylon2 127; Protoss_Pylon 56; Protoss_Opening ; Protoss_Assimilator 283; Protoss_Gateway 79; Protoss_Robotics_Support_Bay 446; Protoss_Expansion -1; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility 388; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun -1; Protoss_Gateway2 586; Protoss_Forge 241; Protoss_Templar_Archives -1; Protoss_Photon_Cannon 272; Protoss_Cybernetics_Core 323; 11 | Protoss_Pylon2 111; Protoss_Pylon 47; Protoss_Opening unknown; Protoss_Assimilator 153; Protoss_Gateway 83; Protoss_Robotics_Support_Bay 477; Protoss_Expansion 291; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility 260; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun 563; Protoss_Gateway2 366; Protoss_Forge 569; Protoss_Templar_Archives 659; Protoss_Photon_Cannon 624; Protoss_Cybernetics_Core 164; 12 | Protoss_Pylon2 133; Protoss_Pylon 56; Protoss_Opening ; Protoss_Assimilator 214; Protoss_Gateway 82; Protoss_Robotics_Support_Bay -1; Protoss_Expansion -1; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility 396; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun -1; Protoss_Gateway2 -1; Protoss_Forge 319; Protoss_Templar_Archives -1; Protoss_Photon_Cannon 356; Protoss_Cybernetics_Core 273; 13 | Protoss_Pylon2 126; Protoss_Pylon 50; Protoss_Opening two_gates; Protoss_Assimilator 165; Protoss_Gateway 79; Protoss_Robotics_Support_Bay 469; Protoss_Expansion 458; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility 413; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun 510; Protoss_Gateway2 105; Protoss_Forge -1; Protoss_Templar_Archives 678; Protoss_Photon_Cannon -1; Protoss_Cybernetics_Core 198; 14 | Protoss_Pylon2 127; Protoss_Pylon 47; Protoss_Opening two_gates; Protoss_Assimilator 159; Protoss_Gateway 76; Protoss_Robotics_Support_Bay 425; Protoss_Expansion 391; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility 292; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun 604; Protoss_Gateway2 100; Protoss_Forge 640; Protoss_Templar_Archives -1; Protoss_Photon_Cannon -1; Protoss_Cybernetics_Core 190; 15 | Protoss_Pylon2 115; Protoss_Pylon 49; Protoss_Opening two_gates; Protoss_Assimilator 99; Protoss_Gateway 79; Protoss_Robotics_Support_Bay 486; Protoss_Expansion 714; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility 285; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun 400; Protoss_Gateway2 191; Protoss_Forge -1; Protoss_Templar_Archives -1; Protoss_Photon_Cannon -1; Protoss_Cybernetics_Core 153; 16 | Protoss_Pylon2 123; Protoss_Pylon 51; Protoss_Opening two_gates; Protoss_Assimilator 326; Protoss_Gateway 80; Protoss_Robotics_Support_Bay -1; Protoss_Expansion 286; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility 444; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun 525; Protoss_Gateway2 100; Protoss_Forge 299; Protoss_Templar_Archives 606; Protoss_Photon_Cannon 332; Protoss_Cybernetics_Core 395; 17 | Protoss_Pylon2 128; Protoss_Pylon 51; Protoss_Opening two_gates; Protoss_Assimilator 240; Protoss_Gateway 79; Protoss_Robotics_Support_Bay -1; Protoss_Expansion 207; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility 505; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun 530; Protoss_Gateway2 105; Protoss_Forge 407; Protoss_Templar_Archives 766; Protoss_Photon_Cannon 460; Protoss_Cybernetics_Core 280; 18 | Protoss_Pylon2 103; Protoss_Pylon 48; Protoss_Opening two_gates; Protoss_Assimilator 127; Protoss_Gateway 79; Protoss_Robotics_Support_Bay 280; Protoss_Expansion 0; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility 207; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun -1; Protoss_Gateway2 376; Protoss_Forge -1; Protoss_Templar_Archives -1; Protoss_Photon_Cannon -1; Protoss_Cybernetics_Core 162; 19 | Protoss_Pylon2 133; Protoss_Pylon 52; Protoss_Opening two_gates; Protoss_Assimilator 229; Protoss_Gateway 82; Protoss_Robotics_Support_Bay -1; Protoss_Expansion 207; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility 334; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun 457; Protoss_Gateway2 106; Protoss_Forge -1; Protoss_Templar_Archives 581; Protoss_Photon_Cannon -1; Protoss_Cybernetics_Core 252; 20 | Protoss_Pylon2 161; Protoss_Pylon 51; Protoss_Opening nony; Protoss_Assimilator 195; Protoss_Gateway 136; Protoss_Robotics_Support_Bay -1; Protoss_Expansion 118; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility 695; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun 406; Protoss_Gateway2 147; Protoss_Forge 347; Protoss_Templar_Archives -1; Protoss_Photon_Cannon 379; Protoss_Cybernetics_Core 245; 21 | Protoss_Pylon2 127; Protoss_Pylon 52; Protoss_Opening two_gates; Protoss_Assimilator 223; Protoss_Gateway 78; Protoss_Robotics_Support_Bay 453; Protoss_Expansion -1; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility 393; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun -1; Protoss_Gateway2 98; Protoss_Forge 326; Protoss_Templar_Archives -1; Protoss_Photon_Cannon 368; Protoss_Cybernetics_Core 275; 22 | Protoss_Pylon2 130; Protoss_Pylon 52; Protoss_Opening two_gates; Protoss_Assimilator 453; Protoss_Gateway 77; Protoss_Robotics_Support_Bay -1; Protoss_Expansion 416; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility 644; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun 575; Protoss_Gateway2 103; Protoss_Forge 566; Protoss_Templar_Archives 713; Protoss_Photon_Cannon 605; Protoss_Cybernetics_Core 471; 23 | Protoss_Pylon2 125; Protoss_Pylon 53; Protoss_Opening two_gates; Protoss_Assimilator 237; Protoss_Gateway 78; Protoss_Robotics_Support_Bay -1; Protoss_Expansion 211; Protoss_Arbiter_Tribunal 986; Protoss_Robotics_Facility 372; Protoss_Fleet_Beacon -1; Protoss_Stargate 866; Protoss_Citadel_of_Adun 524; Protoss_Gateway2 104; Protoss_Forge 677; Protoss_Templar_Archives 648; Protoss_Photon_Cannon 728; Protoss_Cybernetics_Core 261; 24 | Protoss_Pylon2 -1; Protoss_Pylon 0; Protoss_Opening ; Protoss_Assimilator -1; Protoss_Gateway -1; Protoss_Robotics_Support_Bay -1; Protoss_Expansion -1; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility -1; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun -1; Protoss_Gateway2 -1; Protoss_Forge -1; Protoss_Templar_Archives -1; Protoss_Photon_Cannon -1; Protoss_Cybernetics_Core -1; 25 | Protoss_Pylon2 129; Protoss_Pylon 48; Protoss_Opening two_gates; Protoss_Assimilator 103; Protoss_Gateway 77; Protoss_Robotics_Support_Bay -1; Protoss_Expansion -1; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility 538; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun -1; Protoss_Gateway2 164; Protoss_Forge 525; Protoss_Templar_Archives -1; Protoss_Photon_Cannon 556; Protoss_Cybernetics_Core 203; 26 | Protoss_Pylon2 104; Protoss_Pylon 48; Protoss_Opening two_gates; Protoss_Assimilator 230; Protoss_Gateway 78; Protoss_Robotics_Support_Bay -1; Protoss_Expansion 392; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility -1; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun -1; Protoss_Gateway2 129; Protoss_Forge 404; Protoss_Templar_Archives -1; Protoss_Photon_Cannon -1; Protoss_Cybernetics_Core 247; 27 | Protoss_Pylon2 133; Protoss_Pylon 51; Protoss_Opening two_gates; Protoss_Assimilator 188; Protoss_Gateway 79; Protoss_Robotics_Support_Bay 530; Protoss_Expansion 347; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility 372; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun 494; Protoss_Gateway2 109; Protoss_Forge 329; Protoss_Templar_Archives 705; Protoss_Photon_Cannon 568; Protoss_Cybernetics_Core 221; 28 | Protoss_Pylon2 -1; Protoss_Pylon 0; Protoss_Opening ; Protoss_Assimilator -1; Protoss_Gateway -1; Protoss_Robotics_Support_Bay -1; Protoss_Expansion -1; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility -1; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun -1; Protoss_Gateway2 -1; Protoss_Forge -1; Protoss_Templar_Archives -1; Protoss_Photon_Cannon -1; Protoss_Cybernetics_Core -1; 29 | Protoss_Pylon2 128; Protoss_Pylon 48; Protoss_Opening two_gates; Protoss_Assimilator 183; Protoss_Gateway 77; Protoss_Robotics_Support_Bay -1; Protoss_Expansion 393; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility 519; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun 277; Protoss_Gateway2 102; Protoss_Forge 329; Protoss_Templar_Archives 321; Protoss_Photon_Cannon 373; Protoss_Cybernetics_Core 231; 30 | Protoss_Pylon2 -1; Protoss_Pylon 0; Protoss_Opening ; Protoss_Assimilator -1; Protoss_Gateway -1; Protoss_Robotics_Support_Bay -1; Protoss_Expansion -1; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility -1; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun -1; Protoss_Gateway2 -1; Protoss_Forge -1; Protoss_Templar_Archives -1; Protoss_Photon_Cannon -1; Protoss_Cybernetics_Core -1; 31 | Protoss_Pylon2 128; Protoss_Pylon 48; Protoss_Opening unknown; Protoss_Assimilator 103; Protoss_Gateway 86; Protoss_Robotics_Support_Bay 646; Protoss_Expansion 452; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility 232; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun 772; Protoss_Gateway2 282; Protoss_Forge 931; Protoss_Templar_Archives 868; Protoss_Photon_Cannon 1016; Protoss_Cybernetics_Core 155; 32 | Protoss_Pylon2 -1; Protoss_Pylon 49; Protoss_Opening ; Protoss_Assimilator -1; Protoss_Gateway 79; Protoss_Robotics_Support_Bay -1; Protoss_Expansion -1; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility -1; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun -1; Protoss_Gateway2 -1; Protoss_Forge -1; Protoss_Templar_Archives -1; Protoss_Photon_Cannon -1; Protoss_Cybernetics_Core -1; 33 | Protoss_Pylon2 122; Protoss_Pylon 47; Protoss_Opening two_gates; Protoss_Assimilator 98; Protoss_Gateway 76; Protoss_Robotics_Support_Bay 438; Protoss_Expansion 414; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility 250; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun -1; Protoss_Gateway2 270; Protoss_Forge -1; Protoss_Templar_Archives -1; Protoss_Photon_Cannon -1; Protoss_Cybernetics_Core 164; 34 | Protoss_Pylon2 131; Protoss_Pylon 47; Protoss_Opening two_gates; Protoss_Assimilator 99; Protoss_Gateway 77; Protoss_Robotics_Support_Bay -1; Protoss_Expansion -1; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility -1; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun -1; Protoss_Gateway2 115; Protoss_Forge -1; Protoss_Templar_Archives -1; Protoss_Photon_Cannon -1; Protoss_Cybernetics_Core -1; 35 | Protoss_Pylon2 -1; Protoss_Pylon 0; Protoss_Opening ; Protoss_Assimilator -1; Protoss_Gateway -1; Protoss_Robotics_Support_Bay -1; Protoss_Expansion -1; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility -1; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun -1; Protoss_Gateway2 -1; Protoss_Forge -1; Protoss_Templar_Archives -1; Protoss_Photon_Cannon -1; Protoss_Cybernetics_Core -1; 36 | Protoss_Pylon2 116; Protoss_Pylon 53; Protoss_Opening two_gates; Protoss_Assimilator -1; Protoss_Gateway 80; Protoss_Robotics_Support_Bay -1; Protoss_Expansion -1; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility -1; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun -1; Protoss_Gateway2 240; Protoss_Forge 303; Protoss_Templar_Archives -1; Protoss_Photon_Cannon 335; Protoss_Cybernetics_Core -1; 37 | Protoss_Pylon2 118; Protoss_Pylon 49; Protoss_Opening nony; Protoss_Assimilator 107; Protoss_Gateway 81; Protoss_Robotics_Support_Bay 315; Protoss_Expansion 490; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility 243; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun 230; Protoss_Gateway2 304; Protoss_Forge -1; Protoss_Templar_Archives -1; Protoss_Photon_Cannon -1; Protoss_Cybernetics_Core 177; 38 | Protoss_Pylon2 125; Protoss_Pylon 47; Protoss_Opening two_gates; Protoss_Assimilator 97; Protoss_Gateway 75; Protoss_Robotics_Support_Bay -1; Protoss_Expansion 293; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility 397; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun 200; Protoss_Gateway2 256; Protoss_Forge 244; Protoss_Templar_Archives 243; Protoss_Photon_Cannon 311; Protoss_Cybernetics_Core 153; 39 | Protoss_Pylon2 132; Protoss_Pylon 48; Protoss_Opening two_gates; Protoss_Assimilator 100; Protoss_Gateway 79; Protoss_Robotics_Support_Bay 1019; Protoss_Expansion 414; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility 269; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun 386; Protoss_Gateway2 210; Protoss_Forge 501; Protoss_Templar_Archives 453; Protoss_Photon_Cannon 538; Protoss_Cybernetics_Core 169; 40 | Protoss_Pylon2 124; Protoss_Pylon 50; Protoss_Opening unknown; Protoss_Assimilator 99; Protoss_Gateway 77; Protoss_Robotics_Support_Bay 301; Protoss_Expansion 320; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility 243; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun -1; Protoss_Gateway2 344; Protoss_Forge 483; Protoss_Templar_Archives -1; Protoss_Photon_Cannon 517; Protoss_Cybernetics_Core 148; 41 | Protoss_Pylon2 131; Protoss_Pylon 49; Protoss_Opening two_gates; Protoss_Assimilator 266; Protoss_Gateway 76; Protoss_Robotics_Support_Bay 625; Protoss_Expansion 229; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility 571; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun 823; Protoss_Gateway2 103; Protoss_Forge 253; Protoss_Templar_Archives 963; Protoss_Photon_Cannon 301; Protoss_Cybernetics_Core 280; 42 | Protoss_Pylon2 118; Protoss_Pylon 48; Protoss_Opening two_gates; Protoss_Assimilator 261; Protoss_Gateway 77; Protoss_Robotics_Support_Bay -1; Protoss_Expansion -1; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility -1; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun -1; Protoss_Gateway2 103; Protoss_Forge 296; Protoss_Templar_Archives -1; Protoss_Photon_Cannon 327; Protoss_Cybernetics_Core 286; 43 | Protoss_Pylon2 122; Protoss_Pylon 47; Protoss_Opening two_gates; Protoss_Assimilator 97; Protoss_Gateway 76; Protoss_Robotics_Support_Bay 415; Protoss_Expansion 466; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility 324; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun -1; Protoss_Gateway2 195; Protoss_Forge -1; Protoss_Templar_Archives -1; Protoss_Photon_Cannon -1; Protoss_Cybernetics_Core 163; 44 | Protoss_Pylon2 126; Protoss_Pylon 49; Protoss_Opening two_gates; Protoss_Assimilator 213; Protoss_Gateway 78; Protoss_Robotics_Support_Bay -1; Protoss_Expansion 485; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility 383; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun 374; Protoss_Gateway2 103; Protoss_Forge 268; Protoss_Templar_Archives 426; Protoss_Photon_Cannon 299; Protoss_Cybernetics_Core 328; 45 | Protoss_Pylon2 -1; Protoss_Pylon 0; Protoss_Opening ; Protoss_Assimilator -1; Protoss_Gateway -1; Protoss_Robotics_Support_Bay -1; Protoss_Expansion -1; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility -1; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun -1; Protoss_Gateway2 -1; Protoss_Forge -1; Protoss_Templar_Archives -1; Protoss_Photon_Cannon -1; Protoss_Cybernetics_Core -1; 46 | Protoss_Pylon2 131; Protoss_Pylon 49; Protoss_Opening two_gates; Protoss_Assimilator 165; Protoss_Gateway 77; Protoss_Robotics_Support_Bay -1; Protoss_Expansion 394; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility 262; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun 411; Protoss_Gateway2 103; Protoss_Forge 309; Protoss_Templar_Archives 459; Protoss_Photon_Cannon 344; Protoss_Cybernetics_Core 195; 47 | Protoss_Pylon2 124; Protoss_Pylon 49; Protoss_Opening two_gates; Protoss_Assimilator 189; Protoss_Gateway 78; Protoss_Robotics_Support_Bay -1; Protoss_Expansion -1; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility -1; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun -1; Protoss_Gateway2 103; Protoss_Forge -1; Protoss_Templar_Archives -1; Protoss_Photon_Cannon -1; Protoss_Cybernetics_Core 289; 48 | Protoss_Pylon2 134; Protoss_Pylon 48; Protoss_Opening two_gates; Protoss_Assimilator 188; Protoss_Gateway 78; Protoss_Robotics_Support_Bay 367; Protoss_Expansion 394; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility 278; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun 566; Protoss_Gateway2 105; Protoss_Forge 458; Protoss_Templar_Archives -1; Protoss_Photon_Cannon 537; Protoss_Cybernetics_Core 225; 49 | Protoss_Pylon2 127; Protoss_Pylon 49; Protoss_Opening two_gates; Protoss_Assimilator 300; Protoss_Gateway 78; Protoss_Robotics_Support_Bay -1; Protoss_Expansion -1; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility -1; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun -1; Protoss_Gateway2 103; Protoss_Forge 345; Protoss_Templar_Archives -1; Protoss_Photon_Cannon -1; Protoss_Cybernetics_Core 329; 50 | Protoss_Pylon2 121; Protoss_Pylon 48; Protoss_Opening two_gates; Protoss_Assimilator 206; Protoss_Gateway 76; Protoss_Robotics_Support_Bay -1; Protoss_Expansion -1; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility 393; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun -1; Protoss_Gateway2 100; Protoss_Forge 323; Protoss_Templar_Archives -1; Protoss_Photon_Cannon 372; Protoss_Cybernetics_Core 225; 51 | Protoss_Pylon2 128; Protoss_Pylon 47; Protoss_Opening two_gates; Protoss_Assimilator 101; Protoss_Gateway 79; Protoss_Robotics_Support_Bay -1; Protoss_Expansion 356; Protoss_Arbiter_Tribunal 788; Protoss_Robotics_Facility 297; Protoss_Fleet_Beacon -1; Protoss_Stargate 737; Protoss_Citadel_of_Adun 435; Protoss_Gateway2 148; Protoss_Forge 711; Protoss_Templar_Archives 561; Protoss_Photon_Cannon 841; Protoss_Cybernetics_Core 202; 52 | Protoss_Pylon2 109; Protoss_Pylon 48; Protoss_Opening two_gates; Protoss_Assimilator 127; Protoss_Gateway 77; Protoss_Robotics_Support_Bay -1; Protoss_Expansion -1; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility 433; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun -1; Protoss_Gateway2 174; Protoss_Forge 386; Protoss_Templar_Archives -1; Protoss_Photon_Cannon 419; Protoss_Cybernetics_Core 150; 53 | Protoss_Pylon2 125; Protoss_Pylon 49; Protoss_Opening two_gates; Protoss_Assimilator 138; Protoss_Gateway 78; Protoss_Robotics_Support_Bay -1; Protoss_Expansion -1; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility -1; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun 235; Protoss_Gateway2 102; Protoss_Forge 373; Protoss_Templar_Archives 278; Protoss_Photon_Cannon -1; Protoss_Cybernetics_Core 175; 54 | Protoss_Pylon2 132; Protoss_Pylon 52; Protoss_Opening two_gates; Protoss_Assimilator 177; Protoss_Gateway 80; Protoss_Robotics_Support_Bay -1; Protoss_Expansion 518; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility 338; Protoss_Fleet_Beacon 0; Protoss_Stargate 0; Protoss_Citadel_of_Adun 649; Protoss_Gateway2 109; Protoss_Forge 719; Protoss_Templar_Archives 736; Protoss_Photon_Cannon 781; Protoss_Cybernetics_Core 203; 55 | Protoss_Pylon2 157; Protoss_Pylon 52; Protoss_Opening two_gates; Protoss_Assimilator 139; Protoss_Gateway 84; Protoss_Robotics_Support_Bay -1; Protoss_Expansion 586; Protoss_Arbiter_Tribunal -1; Protoss_Robotics_Facility -1; Protoss_Fleet_Beacon -1; Protoss_Stargate -1; Protoss_Citadel_of_Adun 273; Protoss_Gateway2 112; Protoss_Forge 385; Protoss_Templar_Archives 317; Protoss_Photon_Cannon 421; Protoss_Cybernetics_Core 175; 56 | -------------------------------------------------------------------------------- /tTvT.txt: -------------------------------------------------------------------------------- 1 | Terran_Control_Tower 296; Terran_Comsat_Station 596; Terran_Barracks 89; Terran_Expansion 347; Terran_Refinery 107; Terran_Barracks2 459; Terran_Missile_Turret 446; Terran_Supply_Depot 58; Terran_Engineering_Bay 396; Terran_Science_Facility 0; Terran_Machine_Shop 339; Terran_Armory 223; Terran_Starport 242; Terran_Opening TwoFactory; Terran_Academy 531; Terran_Bunker 0; Terran_Factory 166; 2 | Terran_Control_Tower 275; Terran_Comsat_Station 373; Terran_Barracks 107; Terran_Expansion 674; Terran_Refinery 78; Terran_Barracks2 594; Terran_Missile_Turret 0; Terran_Supply_Depot 61; Terran_Engineering_Bay 0; Terran_Science_Facility 0; Terran_Machine_Shop 250; Terran_Armory 214; Terran_Starport 225; Terran_Opening TwoFactory; Terran_Academy 308; Terran_Bunker 0; Terran_Factory 160; 3 | Terran_Control_Tower 313; Terran_Comsat_Station 511; Terran_Barracks 86; Terran_Expansion 238; Terran_Refinery 105; Terran_Barracks2 318; Terran_Missile_Turret 550; Terran_Supply_Depot 54; Terran_Engineering_Bay 486; Terran_Science_Facility 774; Terran_Machine_Shop 624; Terran_Armory 466; Terran_Starport 257; Terran_Opening VultureHarass; Terran_Academy 454; Terran_Bunker 0; Terran_Factory 155; 4 | Terran_Control_Tower 526; Terran_Comsat_Station 537; Terran_Barracks 87; Terran_Expansion 509; Terran_Refinery 104; Terran_Barracks2 237; Terran_Missile_Turret 367; Terran_Supply_Depot 53; Terran_Engineering_Bay 310; Terran_Science_Facility 0; Terran_Machine_Shop 218; Terran_Armory 236; Terran_Starport 427; Terran_Opening TwoFactory; Terran_Academy 479; Terran_Bunker 0; Terran_Factory 158; 5 | Terran_Control_Tower 462; Terran_Comsat_Station 491; Terran_Barracks 101; Terran_Expansion 378; Terran_Refinery 106; Terran_Barracks2 0; Terran_Missile_Turret 520; Terran_Supply_Depot 60; Terran_Engineering_Bay 480; Terran_Science_Facility 647; Terran_Machine_Shop 209; Terran_Armory 427; Terran_Starport 406; Terran_Opening VultureHarass; Terran_Academy 426; Terran_Bunker 0; Terran_Factory 157; 6 | Terran_Control_Tower 433; Terran_Comsat_Station 524; Terran_Barracks 100; Terran_Expansion 231; Terran_Refinery 104; Terran_Barracks2 191; Terran_Missile_Turret 432; Terran_Supply_Depot 60; Terran_Engineering_Bay 383; Terran_Science_Facility 780; Terran_Machine_Shop 230; Terran_Armory 781; Terran_Starport 382; Terran_Opening SiegeExpand; Terran_Academy 468; Terran_Bunker 0; Terran_Factory 170; 7 | Terran_Control_Tower 284; Terran_Comsat_Station 505; Terran_Barracks 91; Terran_Expansion 420; Terran_Refinery 107; Terran_Barracks2 95; Terran_Missile_Turret 346; Terran_Supply_Depot 58; Terran_Engineering_Bay 302; Terran_Science_Facility 741; Terran_Machine_Shop 236; Terran_Armory 272; Terran_Starport 235; Terran_Opening Bio; Terran_Academy 439; Terran_Bunker 0; Terran_Factory 181; 8 | Terran_Control_Tower 473; Terran_Comsat_Station 671; Terran_Barracks 100; Terran_Expansion 400; Terran_Refinery 80; Terran_Barracks2 233; Terran_Missile_Turret 420; Terran_Supply_Depot 62; Terran_Engineering_Bay 326; Terran_Science_Facility 1064; Terran_Machine_Shop 364; Terran_Armory 540; Terran_Starport 211; Terran_Opening FastDropship; Terran_Academy 611; Terran_Bunker 0; Terran_Factory 158; 9 | Terran_Control_Tower 0; Terran_Comsat_Station 673; Terran_Barracks 85; Terran_Expansion 412; Terran_Refinery 116; Terran_Barracks2 543; Terran_Missile_Turret 485; Terran_Supply_Depot 58; Terran_Engineering_Bay 414; Terran_Science_Facility 0; Terran_Machine_Shop 248; Terran_Armory 420; Terran_Starport 612; Terran_Opening TwoFactory; Terran_Academy 597; Terran_Bunker 0; Terran_Factory 175; 10 | Terran_Control_Tower 250; Terran_Comsat_Station 701; Terran_Barracks 88; Terran_Expansion 457; Terran_Refinery 98; Terran_Barracks2 195; Terran_Missile_Turret 437; Terran_Supply_Depot 60; Terran_Engineering_Bay 365; Terran_Science_Facility 0; Terran_Machine_Shop 346; Terran_Armory 683; Terran_Starport 203; Terran_Opening FastDropship; Terran_Academy 603; Terran_Bunker 0; Terran_Factory 148; 11 | Terran_Control_Tower 256; Terran_Comsat_Station 728; Terran_Barracks 101; Terran_Expansion 433; Terran_Refinery 86; Terran_Barracks2 458; Terran_Missile_Turret 479; Terran_Supply_Depot 59; Terran_Engineering_Bay 435; Terran_Science_Facility 0; Terran_Machine_Shop 263; Terran_Armory 0; Terran_Starport 205; Terran_Opening FastDropship; Terran_Academy 607; Terran_Bunker 0; Terran_Factory 153; 12 | Terran_Control_Tower 386; Terran_Comsat_Station 436; Terran_Barracks 86; Terran_Expansion 347; Terran_Refinery 109; Terran_Barracks2 384; Terran_Missile_Turret 498; Terran_Supply_Depot 59; Terran_Engineering_Bay 425; Terran_Science_Facility 0; Terran_Machine_Shop 217; Terran_Armory 261; Terran_Starport 331; Terran_Opening TwoFactory; Terran_Academy 375; Terran_Bunker 0; Terran_Factory 163; 13 | Terran_Control_Tower 617; Terran_Comsat_Station 450; Terran_Barracks 92; Terran_Expansion 601; Terran_Refinery 108; Terran_Barracks2 319; Terran_Missile_Turret 518; Terran_Supply_Depot 60; Terran_Engineering_Bay 451; Terran_Science_Facility 0; Terran_Machine_Shop 242; Terran_Armory 302; Terran_Starport 554; Terran_Opening TwoFactory; Terran_Academy 376; Terran_Bunker 0; Terran_Factory 164; 14 | Terran_Control_Tower 681; Terran_Comsat_Station 944; Terran_Barracks 88; Terran_Expansion 391; Terran_Refinery 105; Terran_Barracks2 461; Terran_Missile_Turret 836; Terran_Supply_Depot 58; Terran_Engineering_Bay 637; Terran_Science_Facility 0; Terran_Machine_Shop 255; Terran_Armory 217; Terran_Starport 531; Terran_Opening TwoFactory; Terran_Academy 856; Terran_Bunker 0; Terran_Factory 163; 15 | Terran_Control_Tower 465; Terran_Comsat_Station 637; Terran_Barracks 97; Terran_Expansion 635; Terran_Refinery 113; Terran_Barracks2 321; Terran_Missile_Turret 384; Terran_Supply_Depot 62; Terran_Engineering_Bay 326; Terran_Science_Facility 0; Terran_Machine_Shop 247; Terran_Armory 299; Terran_Starport 414; Terran_Opening TwoFactory; Terran_Academy 575; Terran_Bunker 0; Terran_Factory 170; 16 | Terran_Control_Tower 352; Terran_Comsat_Station 631; Terran_Barracks 94; Terran_Expansion 424; Terran_Refinery 110; Terran_Barracks2 0; Terran_Missile_Turret 0; Terran_Supply_Depot 58; Terran_Engineering_Bay 651; Terran_Science_Facility 0; Terran_Machine_Shop 279; Terran_Armory 0; Terran_Starport 222; Terran_Opening VultureHarass; Terran_Academy 573; Terran_Bunker 0; Terran_Factory 169; 17 | Terran_Control_Tower 459; Terran_Comsat_Station 639; Terran_Barracks 92; Terran_Expansion 227; Terran_Refinery 109; Terran_Barracks2 0; Terran_Missile_Turret 368; Terran_Supply_Depot 59; Terran_Engineering_Bay 325; Terran_Science_Facility 605; Terran_Machine_Shop 211; Terran_Armory 381; Terran_Starport 362; Terran_Opening SiegeExpand; Terran_Academy 585; Terran_Bunker 0; Terran_Factory 159; 18 | Terran_Control_Tower 613; Terran_Comsat_Station 548; Terran_Barracks 89; Terran_Expansion 323; Terran_Refinery 105; Terran_Barracks2 812; Terran_Missile_Turret 466; Terran_Supply_Depot 58; Terran_Engineering_Bay 423; Terran_Science_Facility 0; Terran_Machine_Shop 270; Terran_Armory 361; Terran_Starport 543; Terran_Opening TwoFactory; Terran_Academy 482; Terran_Bunker 0; Terran_Factory 155; 19 | Terran_Control_Tower 0; Terran_Comsat_Station 0; Terran_Barracks 91; Terran_Expansion 0; Terran_Refinery 107; Terran_Barracks2 0; Terran_Missile_Turret 0; Terran_Supply_Depot 60; Terran_Engineering_Bay 0; Terran_Science_Facility 0; Terran_Machine_Shop 211; Terran_Armory 298; Terran_Starport 357; Terran_Opening TwoFactory; Terran_Academy 0; Terran_Bunker 0; Terran_Factory 156; 20 | Terran_Control_Tower 0; Terran_Comsat_Station 741; Terran_Barracks 94; Terran_Expansion 487; Terran_Refinery 110; Terran_Barracks2 153; Terran_Missile_Turret 320; Terran_Supply_Depot 61; Terran_Engineering_Bay 264; Terran_Science_Facility 0; Terran_Machine_Shop 262; Terran_Armory 509; Terran_Starport 249; Terran_Opening Bio; Terran_Academy 661; Terran_Bunker 0; Terran_Factory 176; 21 | Terran_Control_Tower 282; Terran_Comsat_Station 658; Terran_Barracks 92; Terran_Expansion 274; Terran_Refinery 114; Terran_Barracks2 223; Terran_Missile_Turret 497; Terran_Supply_Depot 60; Terran_Engineering_Bay 353; Terran_Science_Facility 921; Terran_Machine_Shop 227; Terran_Armory 551; Terran_Starport 230; Terran_Opening FastDropship; Terran_Academy 586; Terran_Bunker 0; Terran_Factory 175; 22 | Terran_Control_Tower 280; Terran_Comsat_Station 411; Terran_Barracks 118; Terran_Expansion 472; Terran_Refinery 85; Terran_Barracks2 422; Terran_Missile_Turret 388; Terran_Supply_Depot 59; Terran_Engineering_Bay 338; Terran_Science_Facility 1061; Terran_Machine_Shop 237; Terran_Armory 237; Terran_Starport 234; Terran_Opening FastDropship; Terran_Academy 340; Terran_Bunker 0; Terran_Factory 177; 23 | Terran_Control_Tower 255; Terran_Comsat_Station 430; Terran_Barracks 86; Terran_Expansion 348; Terran_Refinery 102; Terran_Barracks2 389; Terran_Missile_Turret 471; Terran_Supply_Depot 60; Terran_Engineering_Bay 423; Terran_Science_Facility 0; Terran_Machine_Shop 247; Terran_Armory 990; Terran_Starport 207; Terran_Opening FastDropship; Terran_Academy 369; Terran_Bunker 0; Terran_Factory 154; 24 | Terran_Control_Tower 274; Terran_Comsat_Station 920; Terran_Barracks 89; Terran_Expansion 209; Terran_Refinery 106; Terran_Barracks2 0; Terran_Missile_Turret 335; Terran_Supply_Depot 59; Terran_Engineering_Bay 295; Terran_Science_Facility 900; Terran_Machine_Shop 229; Terran_Armory 673; Terran_Starport 225; Terran_Opening FastDropship; Terran_Academy 863; Terran_Bunker 0; Terran_Factory 157; 25 | Terran_Control_Tower 335; Terran_Comsat_Station 799; Terran_Barracks 93; Terran_Expansion 325; Terran_Refinery 110; Terran_Barracks2 196; Terran_Missile_Turret 587; Terran_Supply_Depot 60; Terran_Engineering_Bay 547; Terran_Science_Facility 0; Terran_Machine_Shop 253; Terran_Armory 1064; Terran_Starport 230; Terran_Opening FastDropship; Terran_Academy 744; Terran_Bunker 0; Terran_Factory 173; 26 | Terran_Control_Tower 283; Terran_Comsat_Station 600; Terran_Barracks 90; Terran_Expansion 350; Terran_Refinery 113; Terran_Barracks2 179; Terran_Missile_Turret 491; Terran_Supply_Depot 59; Terran_Engineering_Bay 448; Terran_Science_Facility 940; Terran_Machine_Shop 260; Terran_Armory 684; Terran_Starport 225; Terran_Opening FastDropship; Terran_Academy 544; Terran_Bunker 0; Terran_Factory 170; 27 | Terran_Control_Tower 489; Terran_Comsat_Station 286; Terran_Barracks 88; Terran_Expansion 405; Terran_Refinery 101; Terran_Barracks2 0; Terran_Missile_Turret 377; Terran_Supply_Depot 54; Terran_Engineering_Bay 308; Terran_Science_Facility 0; Terran_Machine_Shop 215; Terran_Armory 218; Terran_Starport 431; Terran_Opening SiegeExpand; Terran_Academy 228; Terran_Bunker 0; Terran_Factory 153; 28 | Terran_Control_Tower 0; Terran_Comsat_Station 352; Terran_Barracks 93; Terran_Expansion 336; Terran_Refinery 126; Terran_Barracks2 248; Terran_Missile_Turret 419; Terran_Supply_Depot 60; Terran_Engineering_Bay 371; Terran_Science_Facility 0; Terran_Machine_Shop 333; Terran_Armory 231; Terran_Starport 0; Terran_Opening TwoFactory; Terran_Academy 274; Terran_Bunker 0; Terran_Factory 178; 29 | Terran_Control_Tower 0; Terran_Comsat_Station 0; Terran_Barracks 93; Terran_Expansion 245; Terran_Refinery 98; Terran_Barracks2 0; Terran_Missile_Turret 0; Terran_Supply_Depot 57; Terran_Engineering_Bay 0; Terran_Science_Facility 0; Terran_Machine_Shop 218; Terran_Armory 0; Terran_Starport 0; Terran_Opening VultureHarass; Terran_Academy 0; Terran_Bunker 257; Terran_Factory 147; 30 | Terran_Control_Tower 0; Terran_Comsat_Station 0; Terran_Barracks 89; Terran_Expansion 0; Terran_Refinery 167; Terran_Barracks2 116; Terran_Missile_Turret 0; Terran_Supply_Depot 58; Terran_Engineering_Bay 0; Terran_Science_Facility 0; Terran_Machine_Shop 0; Terran_Armory 0; Terran_Starport 0; Terran_Opening Bio; Terran_Academy 189; Terran_Bunker 0; Terran_Factory 0; 31 | Terran_Control_Tower 751; Terran_Comsat_Station 519; Terran_Barracks 81; Terran_Expansion 214; Terran_Refinery 103; Terran_Barracks2 0; Terran_Missile_Turret 823; Terran_Supply_Depot 56; Terran_Engineering_Bay 769; Terran_Science_Facility 739; Terran_Machine_Shop 250; Terran_Armory 333; Terran_Starport 601; Terran_Opening VultureHarass; Terran_Academy 452; Terran_Bunker 0; Terran_Factory 157; 32 | Terran_Control_Tower 564; Terran_Comsat_Station 614; Terran_Barracks 106; Terran_Expansion 289; Terran_Refinery 104; Terran_Barracks2 164; Terran_Missile_Turret 402; Terran_Supply_Depot 72; Terran_Engineering_Bay 320; Terran_Science_Facility 567; Terran_Machine_Shop 235; Terran_Armory 215; Terran_Starport 516; Terran_Opening VultureHarass; Terran_Academy 522; Terran_Bunker 0; Terran_Factory 163; 33 | Terran_Control_Tower 374; Terran_Comsat_Station 898; Terran_Barracks 86; Terran_Expansion 363; Terran_Refinery 99; Terran_Barracks2 331; Terran_Missile_Turret 561; Terran_Supply_Depot 58; Terran_Engineering_Bay 483; Terran_Science_Facility 0; Terran_Machine_Shop 206; Terran_Armory 933; Terran_Starport 213; Terran_Opening VultureHarass; Terran_Academy 831; Terran_Bunker 713; Terran_Factory 153; 34 | Terran_Control_Tower 553; Terran_Comsat_Station 435; Terran_Barracks 85; Terran_Expansion 412; Terran_Refinery 98; Terran_Barracks2 297; Terran_Missile_Turret 488; Terran_Supply_Depot 56; Terran_Engineering_Bay 445; Terran_Science_Facility 0; Terran_Machine_Shop 210; Terran_Armory 206; Terran_Starport 492; Terran_Opening TwoFactory; Terran_Academy 359; Terran_Bunker 0; Terran_Factory 154; 35 | Terran_Control_Tower 490; Terran_Comsat_Station 533; Terran_Barracks 90; Terran_Expansion 246; Terran_Refinery 115; Terran_Barracks2 150; Terran_Missile_Turret 391; Terran_Supply_Depot 61; Terran_Engineering_Bay 329; Terran_Science_Facility 666; Terran_Machine_Shop 250; Terran_Armory 289; Terran_Starport 434; Terran_Opening Bio; Terran_Academy 445; Terran_Bunker 0; Terran_Factory 176; 36 | Terran_Control_Tower 0; Terran_Comsat_Station 396; Terran_Barracks 101; Terran_Expansion 239; Terran_Refinery 105; Terran_Barracks2 161; Terran_Missile_Turret 0; Terran_Supply_Depot 60; Terran_Engineering_Bay 386; Terran_Science_Facility 0; Terran_Machine_Shop 269; Terran_Armory 291; Terran_Starport 0; Terran_Opening VultureHarass; Terran_Academy 325; Terran_Bunker 0; Terran_Factory 157; 37 | Terran_Control_Tower 261; Terran_Comsat_Station 0; Terran_Barracks 90; Terran_Expansion 325; Terran_Refinery 103; Terran_Barracks2 0; Terran_Missile_Turret 0; Terran_Supply_Depot 55; Terran_Engineering_Bay 0; Terran_Science_Facility 0; Terran_Machine_Shop 266; Terran_Armory 0; Terran_Starport 214; Terran_Opening FastDropship; Terran_Academy 420; Terran_Bunker 0; Terran_Factory 159; 38 | Terran_Control_Tower 523; Terran_Comsat_Station 410; Terran_Barracks 100; Terran_Expansion 325; Terran_Refinery 106; Terran_Barracks2 581; Terran_Missile_Turret 768; Terran_Supply_Depot 57; Terran_Engineering_Bay 672; Terran_Science_Facility 946; Terran_Machine_Shop 214; Terran_Armory 369; Terran_Starport 473; Terran_Opening SiegeExpand; Terran_Academy 352; Terran_Bunker 277; Terran_Factory 160; 39 | Terran_Control_Tower 428; Terran_Comsat_Station 872; Terran_Barracks 66; Terran_Expansion 251; Terran_Refinery 196; Terran_Barracks2 353; Terran_Missile_Turret 945; Terran_Supply_Depot 85; Terran_Engineering_Bay 875; Terran_Science_Facility 0; Terran_Machine_Shop 545; Terran_Armory 426; Terran_Starport 338; Terran_Opening FastDropship; Terran_Academy 788; Terran_Bunker 161; Terran_Factory 282; 40 | Terran_Control_Tower 319; Terran_Comsat_Station 628; Terran_Barracks 97; Terran_Expansion 217; Terran_Refinery 101; Terran_Barracks2 724; Terran_Missile_Turret 0; Terran_Supply_Depot 55; Terran_Engineering_Bay 0; Terran_Science_Facility 0; Terran_Machine_Shop 227; Terran_Armory 262; Terran_Starport 269; Terran_Opening VultureHarass; Terran_Academy 558; Terran_Bunker 0; Terran_Factory 153; 41 | Terran_Control_Tower 677; Terran_Comsat_Station 654; Terran_Barracks 99; Terran_Expansion 236; Terran_Refinery 106; Terran_Barracks2 534; Terran_Missile_Turret 0; Terran_Supply_Depot 59; Terran_Engineering_Bay 0; Terran_Science_Facility 0; Terran_Machine_Shop 274; Terran_Armory 425; Terran_Starport 575; Terran_Opening VultureHarass; Terran_Academy 595; Terran_Bunker 0; Terran_Factory 161; 42 | Terran_Control_Tower 684; Terran_Comsat_Station 766; Terran_Barracks 99; Terran_Expansion 280; Terran_Refinery 100; Terran_Barracks2 0; Terran_Missile_Turret 770; Terran_Supply_Depot 57; Terran_Engineering_Bay 607; Terran_Science_Facility 837; Terran_Machine_Shop 256; Terran_Armory 558; Terran_Starport 628; Terran_Opening VultureHarass; Terran_Academy 664; Terran_Bunker 0; Terran_Factory 162; 43 | Terran_Control_Tower 584; Terran_Comsat_Station 452; Terran_Barracks 99; Terran_Expansion 223; Terran_Refinery 103; Terran_Barracks2 264; Terran_Missile_Turret 335; Terran_Supply_Depot 58; Terran_Engineering_Bay 294; Terran_Science_Facility 0; Terran_Machine_Shop 218; Terran_Armory 327; Terran_Starport 518; Terran_Opening SiegeExpand; Terran_Academy 389; Terran_Bunker 0; Terran_Factory 165; 44 | Terran_Control_Tower 520; Terran_Comsat_Station 408; Terran_Barracks 84; Terran_Expansion 203; Terran_Refinery 100; Terran_Barracks2 459; Terran_Missile_Turret 644; Terran_Supply_Depot 55; Terran_Engineering_Bay 573; Terran_Science_Facility 617; Terran_Machine_Shop 206; Terran_Armory 264; Terran_Starport 460; Terran_Opening VultureHarass; Terran_Academy 350; Terran_Bunker 0; Terran_Factory 154; 45 | Terran_Control_Tower 734; Terran_Comsat_Station 553; Terran_Barracks 87; Terran_Expansion 329; Terran_Refinery 102; Terran_Barracks2 559; Terran_Missile_Turret 518; Terran_Supply_Depot 55; Terran_Engineering_Bay 475; Terran_Science_Facility 1042; Terran_Machine_Shop 354; Terran_Armory 384; Terran_Starport 675; Terran_Opening VultureHarass; Terran_Academy 489; Terran_Bunker 0; Terran_Factory 252; 46 | Terran_Control_Tower 0; Terran_Comsat_Station 0; Terran_Barracks 96; Terran_Expansion 342; Terran_Refinery 99; Terran_Barracks2 674; Terran_Missile_Turret 0; Terran_Supply_Depot 56; Terran_Engineering_Bay 0; Terran_Science_Facility 0; Terran_Machine_Shop 752; Terran_Armory 486; Terran_Starport 673; Terran_Opening VultureHarass; Terran_Academy 0; Terran_Bunker 158; Terran_Factory 175; 47 | Terran_Control_Tower 0; Terran_Comsat_Station 0; Terran_Barracks 0; Terran_Expansion 0; Terran_Refinery 0; Terran_Barracks2 0; Terran_Missile_Turret 0; Terran_Supply_Depot 0; Terran_Engineering_Bay 0; Terran_Science_Facility 0; Terran_Machine_Shop 0; Terran_Armory 0; Terran_Starport 0; Terran_Opening Unknown; Terran_Academy 0; Terran_Bunker 0; Terran_Factory 0; 48 | Terran_Control_Tower 482; Terran_Comsat_Station 390; Terran_Barracks 98; Terran_Expansion 197; Terran_Refinery 100; Terran_Barracks2 163; Terran_Missile_Turret 672; Terran_Supply_Depot 56; Terran_Engineering_Bay 627; Terran_Science_Facility 753; Terran_Machine_Shop 264; Terran_Armory 256; Terran_Starport 404; Terran_Opening VultureHarass; Terran_Academy 316; Terran_Bunker 0; Terran_Factory 152; 49 | Terran_Control_Tower 0; Terran_Comsat_Station 418; Terran_Barracks 88; Terran_Expansion 313; Terran_Refinery 105; Terran_Barracks2 348; Terran_Missile_Turret 0; Terran_Supply_Depot 55; Terran_Engineering_Bay 0; Terran_Science_Facility 0; Terran_Machine_Shop 256; Terran_Armory 0; Terran_Starport 207; Terran_Opening FastDropship; Terran_Academy 339; Terran_Bunker 0; Terran_Factory 154; 50 | Terran_Control_Tower 428; Terran_Comsat_Station 872; Terran_Barracks 66; Terran_Expansion 251; Terran_Refinery 196; Terran_Barracks2 353; Terran_Missile_Turret 945; Terran_Supply_Depot 85; Terran_Engineering_Bay 875; Terran_Science_Facility 0; Terran_Machine_Shop 545; Terran_Armory 426; Terran_Starport 338; Terran_Opening FastDropship; Terran_Academy 788; Terran_Bunker 161; Terran_Factory 282; 51 | Terran_Control_Tower 677; Terran_Comsat_Station 654; Terran_Barracks 99; Terran_Expansion 236; Terran_Refinery 106; Terran_Barracks2 534; Terran_Missile_Turret 0; Terran_Supply_Depot 59; Terran_Engineering_Bay 0; Terran_Science_Facility 0; Terran_Machine_Shop 274; Terran_Armory 425; Terran_Starport 575; Terran_Opening VultureHarass; Terran_Academy 595; Terran_Bunker 0; Terran_Factory 161; 52 | Terran_Control_Tower 0; Terran_Comsat_Station 479; Terran_Barracks 85; Terran_Expansion 216; Terran_Refinery 111; Terran_Barracks2 327; Terran_Missile_Turret 641; Terran_Supply_Depot 58; Terran_Engineering_Bay 578; Terran_Science_Facility 0; Terran_Machine_Shop 241; Terran_Armory 446; Terran_Starport 497; Terran_Opening VultureHarass; Terran_Academy 396; Terran_Bunker 0; Terran_Factory 167; 53 | Terran_Control_Tower 270; Terran_Comsat_Station 0; Terran_Barracks 101; Terran_Expansion 0; Terran_Refinery 100; Terran_Barracks2 0; Terran_Missile_Turret 0; Terran_Supply_Depot 57; Terran_Engineering_Bay 0; Terran_Science_Facility 0; Terran_Machine_Shop 243; Terran_Armory 0; Terran_Starport 214; Terran_Opening FastDropship; Terran_Academy 0; Terran_Bunker 0; Terran_Factory 158; 54 | Terran_Control_Tower 403; Terran_Comsat_Station 505; Terran_Barracks 99; Terran_Expansion 242; Terran_Refinery 98; Terran_Barracks2 601; Terran_Missile_Turret 624; Terran_Supply_Depot 55; Terran_Engineering_Bay 579; Terran_Science_Facility 697; Terran_Machine_Shop 247; Terran_Armory 301; Terran_Starport 332; Terran_Opening VultureHarass; Terran_Academy 370; Terran_Bunker 0; Terran_Factory 151; 55 | Terran_Control_Tower 0; Terran_Comsat_Station 0; Terran_Barracks 83; Terran_Expansion 0; Terran_Refinery 101; Terran_Barracks2 0; Terran_Missile_Turret 0; Terran_Supply_Depot 58; Terran_Engineering_Bay 0; Terran_Science_Facility 0; Terran_Machine_Shop 0; Terran_Armory 285; Terran_Starport 0; Terran_Opening TwoFactory; Terran_Academy 0; Terran_Bunker 0; Terran_Factory 186; 56 | Terran_Control_Tower 0; Terran_Comsat_Station 621; Terran_Barracks 91; Terran_Expansion 355; Terran_Refinery 102; Terran_Barracks2 0; Terran_Missile_Turret 443; Terran_Supply_Depot 58; Terran_Engineering_Bay 373; Terran_Science_Facility 0; Terran_Machine_Shop 230; Terran_Armory 946; Terran_Starport 0; Terran_Opening TwoFactory; Terran_Academy 532; Terran_Bunker 0; Terran_Factory 156; 57 | Terran_Control_Tower 994; Terran_Comsat_Station 777; Terran_Barracks 84; Terran_Expansion 369; Terran_Refinery 107; Terran_Barracks2 0; Terran_Missile_Turret 607; Terran_Supply_Depot 60; Terran_Engineering_Bay 542; Terran_Science_Facility 0; Terran_Machine_Shop 214; Terran_Armory 247; Terran_Starport 748; Terran_Opening TwoFactory; Terran_Academy 714; Terran_Bunker 0; Terran_Factory 162; 58 | Terran_Control_Tower 681; Terran_Comsat_Station 944; Terran_Barracks 88; Terran_Expansion 391; Terran_Refinery 105; Terran_Barracks2 461; Terran_Missile_Turret 836; Terran_Supply_Depot 58; Terran_Engineering_Bay 637; Terran_Science_Facility 0; Terran_Machine_Shop 255; Terran_Armory 217; Terran_Starport 531; Terran_Opening TwoFactory; Terran_Academy 856; Terran_Bunker 0; Terran_Factory 163; 59 | Terran_Control_Tower 417; Terran_Comsat_Station 581; Terran_Barracks 91; Terran_Expansion 580; Terran_Refinery 100; Terran_Barracks2 391; Terran_Missile_Turret 0; Terran_Supply_Depot 60; Terran_Engineering_Bay 0; Terran_Science_Facility 0; Terran_Machine_Shop 203; Terran_Armory 258; Terran_Starport 359; Terran_Opening TwoFactory; Terran_Academy 445; Terran_Bunker 0; Terran_Factory 150; 60 | Terran_Control_Tower 257; Terran_Comsat_Station 0; Terran_Barracks 102; Terran_Expansion 0; Terran_Refinery 77; Terran_Barracks2 0; Terran_Missile_Turret 0; Terran_Supply_Depot 58; Terran_Engineering_Bay 0; Terran_Science_Facility 0; Terran_Machine_Shop 229; Terran_Armory 0; Terran_Starport 208; Terran_Opening VultureHarass; Terran_Academy 0; Terran_Bunker 0; Terran_Factory 153; 61 | Terran_Control_Tower 313; Terran_Comsat_Station 527; Terran_Barracks 82; Terran_Expansion 445; Terran_Refinery 99; Terran_Barracks2 221; Terran_Missile_Turret 584; Terran_Supply_Depot 59; Terran_Engineering_Bay 519; Terran_Science_Facility 0; Terran_Machine_Shop 205; Terran_Armory 574; Terran_Starport 207; Terran_Opening TwoFactory; Terran_Academy 471; Terran_Bunker 0; Terran_Factory 152; 62 | -------------------------------------------------------------------------------- /tTvTx.txt: -------------------------------------------------------------------------------- 1 | Terran_Control_Tower 274; Terran_Comsat_Station 1043; Terran_Barracks 108; Terran_Expansion 596; Terran_Refinery 80; Terran_Barracks2 170; Terran_Missile_Turret 388; Terran_Supply_Depot 59; Terran_Engineering_Bay 331; Terran_Science_Facility -1; Terran_Machine_Shop 220; Terran_Armory 818; Terran_Starport 220; Terran_Opening two_facto; Terran_Academy 910; Terran_Bunker -1; Terran_Factory 168; 2 | Terran_Control_Tower 289; Terran_Comsat_Station -1; Terran_Barracks 102; Terran_Expansion -1; Terran_Refinery 115; Terran_Barracks2 252; Terran_Missile_Turret -1; Terran_Supply_Depot 60; Terran_Engineering_Bay -1; Terran_Science_Facility -1; Terran_Machine_Shop 224; Terran_Armory 261; Terran_Starport 239; Terran_Opening two_facto; Terran_Academy -1; Terran_Bunker -1; Terran_Factory 170; 3 | Terran_Control_Tower 402; Terran_Comsat_Station 799; Terran_Barracks 84; Terran_Expansion 345; Terran_Refinery 109; Terran_Barracks2 -1; Terran_Missile_Turret 785; Terran_Supply_Depot 60; Terran_Engineering_Bay 311; Terran_Science_Facility 0; Terran_Machine_Shop 217; Terran_Armory 746; Terran_Starport 354; Terran_Opening rax_fe; Terran_Academy 734; Terran_Bunker -1; Terran_Factory 164; 4 | Terran_Control_Tower 358; Terran_Comsat_Station 470; Terran_Barracks 83; Terran_Expansion 372; Terran_Refinery 100; Terran_Barracks2 561; Terran_Missile_Turret 570; Terran_Supply_Depot 59; Terran_Engineering_Bay 475; Terran_Science_Facility 718; Terran_Machine_Shop 259; Terran_Armory 243; Terran_Starport 277; Terran_Opening two_facto; Terran_Academy 415; Terran_Bunker -1; Terran_Factory 156; 5 | Terran_Control_Tower 507; Terran_Comsat_Station 315; Terran_Barracks 96; Terran_Expansion 553; Terran_Refinery 135; Terran_Barracks2 394; Terran_Missile_Turret 1035; Terran_Supply_Depot 70; Terran_Engineering_Bay 987; Terran_Science_Facility -1; Terran_Machine_Shop 384; Terran_Armory 398; Terran_Starport 344; Terran_Opening bio; Terran_Academy 207; Terran_Bunker 912; Terran_Factory 269; 6 | Terran_Control_Tower 273; Terran_Comsat_Station 625; Terran_Barracks 91; Terran_Expansion 448; Terran_Refinery 109; Terran_Barracks2 186; Terran_Missile_Turret 950; Terran_Supply_Depot 61; Terran_Engineering_Bay 890; Terran_Science_Facility 915; Terran_Machine_Shop 364; Terran_Armory 228; Terran_Starport 224; Terran_Opening rax_fe; Terran_Academy 537; Terran_Bunker -1; Terran_Factory 169; 7 | Terran_Control_Tower 265; Terran_Comsat_Station 448; Terran_Barracks 86; Terran_Expansion 454; Terran_Refinery 101; Terran_Barracks2 140; Terran_Missile_Turret 379; Terran_Supply_Depot 50; Terran_Engineering_Bay 337; Terran_Science_Facility -1; Terran_Machine_Shop 215; Terran_Armory 220; Terran_Starport 213; Terran_Opening unknown; Terran_Academy 393; Terran_Bunker -1; Terran_Factory 161; 8 | Terran_Control_Tower 328; Terran_Comsat_Station -1; Terran_Barracks 91; Terran_Expansion 396; Terran_Refinery 108; Terran_Barracks2 275; Terran_Missile_Turret 520; Terran_Supply_Depot 58; Terran_Engineering_Bay 334; Terran_Science_Facility -1; Terran_Machine_Shop 209; Terran_Armory -1; Terran_Starport 280; Terran_Opening rax_fe; Terran_Academy -1; Terran_Bunker -1; Terran_Factory 156; 9 | Terran_Control_Tower 964; Terran_Comsat_Station 1061; Terran_Barracks 100; Terran_Expansion 544; Terran_Refinery 405; Terran_Barracks2 562; Terran_Missile_Turret 802; Terran_Supply_Depot 53; Terran_Engineering_Bay 752; Terran_Science_Facility -1; Terran_Machine_Shop 844; Terran_Armory 946; Terran_Starport 869; Terran_Opening bio; Terran_Academy 891; Terran_Bunker 299; Terran_Factory 780; 10 | Terran_Control_Tower 261; Terran_Comsat_Station 629; Terran_Barracks 86; Terran_Expansion 535; Terran_Refinery 98; Terran_Barracks2 157; Terran_Missile_Turret 446; Terran_Supply_Depot 66; Terran_Engineering_Bay 363; Terran_Science_Facility -1; Terran_Machine_Shop 246; Terran_Armory 426; Terran_Starport 204; Terran_Opening bio; Terran_Academy 552; Terran_Bunker -1; Terran_Factory 150; 11 | Terran_Control_Tower 564; Terran_Comsat_Station 614; Terran_Barracks 106; Terran_Expansion 289; Terran_Refinery 104; Terran_Barracks2 164; Terran_Missile_Turret 402; Terran_Supply_Depot 72; Terran_Engineering_Bay 320; Terran_Science_Facility 567; Terran_Machine_Shop 235; Terran_Armory 215; Terran_Starport 516; Terran_Opening rax_fe; Terran_Academy 522; Terran_Bunker -1; Terran_Factory 163; 12 | Terran_Control_Tower 391; Terran_Comsat_Station 623; Terran_Barracks 92; Terran_Expansion 310; Terran_Refinery 115; Terran_Barracks2 301; Terran_Missile_Turret 594; Terran_Supply_Depot 61; Terran_Engineering_Bay 392; Terran_Science_Facility -1; Terran_Machine_Shop 390; Terran_Armory 230; Terran_Starport 333; Terran_Opening rax_fe; Terran_Academy 554; Terran_Bunker -1; Terran_Factory 168; 13 | Terran_Control_Tower 809; Terran_Comsat_Station 528; Terran_Barracks 91; Terran_Expansion 371; Terran_Refinery 124; Terran_Barracks2 -1; Terran_Missile_Turret 422; Terran_Supply_Depot 58; Terran_Engineering_Bay 380; Terran_Science_Facility -1; Terran_Machine_Shop 373; Terran_Armory 372; Terran_Starport 577; Terran_Opening rax_fe; Terran_Academy 472; Terran_Bunker -1; Terran_Factory 175; 14 | Terran_Control_Tower 557; Terran_Comsat_Station 870; Terran_Barracks 97; Terran_Expansion 534; Terran_Refinery 102; Terran_Barracks2 484; Terran_Missile_Turret 814; Terran_Supply_Depot 60; Terran_Engineering_Bay 756; Terran_Science_Facility -1; Terran_Machine_Shop 340; Terran_Armory 373; Terran_Starport 253; Terran_Opening two_facto; Terran_Academy 812; Terran_Bunker -1; Terran_Factory 157; 15 | Terran_Control_Tower 459; Terran_Comsat_Station 639; Terran_Barracks 92; Terran_Expansion 227; Terran_Refinery 109; Terran_Barracks2 -1; Terran_Missile_Turret 368; Terran_Supply_Depot 59; Terran_Engineering_Bay 325; Terran_Science_Facility 605; Terran_Machine_Shop 211; Terran_Armory 381; Terran_Starport 362; Terran_Opening rax_fe; Terran_Academy 585; Terran_Bunker -1; Terran_Factory 159; 16 | Terran_Control_Tower 613; Terran_Comsat_Station 548; Terran_Barracks 89; Terran_Expansion 323; Terran_Refinery 105; Terran_Barracks2 812; Terran_Missile_Turret 466; Terran_Supply_Depot 58; Terran_Engineering_Bay 423; Terran_Science_Facility -1; Terran_Machine_Shop 270; Terran_Armory 361; Terran_Starport 543; Terran_Opening rax_fe; Terran_Academy 482; Terran_Bunker -1; Terran_Factory 155; 17 | Terran_Control_Tower -1; Terran_Comsat_Station -1; Terran_Barracks 83; Terran_Expansion -1; Terran_Refinery 99; Terran_Barracks2 -1; Terran_Missile_Turret -1; Terran_Supply_Depot 57; Terran_Engineering_Bay -1; Terran_Science_Facility -1; Terran_Machine_Shop 226; Terran_Armory -1; Terran_Starport -1; Terran_Opening two_facto; Terran_Academy -1; Terran_Bunker -1; Terran_Factory 153; 18 | Terran_Control_Tower 255; Terran_Comsat_Station 430; Terran_Barracks 86; Terran_Expansion 348; Terran_Refinery 102; Terran_Barracks2 389; Terran_Missile_Turret 471; Terran_Supply_Depot 60; Terran_Engineering_Bay 423; Terran_Science_Facility 0; Terran_Machine_Shop 247; Terran_Armory 990; Terran_Starport 207; Terran_Opening rax_fe; Terran_Academy 369; Terran_Bunker -1; Terran_Factory 154; 19 | Terran_Control_Tower 282; Terran_Comsat_Station 779; Terran_Barracks 92; Terran_Expansion 405; Terran_Refinery 108; Terran_Barracks2 358; Terran_Missile_Turret 586; Terran_Supply_Depot 61; Terran_Engineering_Bay 521; Terran_Science_Facility 861; Terran_Machine_Shop 249; Terran_Armory 221; Terran_Starport 230; Terran_Opening rax_fe; Terran_Academy 682; Terran_Bunker -1; Terran_Factory 162; 20 | Terran_Control_Tower 343; Terran_Comsat_Station 670; Terran_Barracks 91; Terran_Expansion 261; Terran_Refinery 106; Terran_Barracks2 146; Terran_Missile_Turret 422; Terran_Supply_Depot 57; Terran_Engineering_Bay 370; Terran_Science_Facility 0; Terran_Machine_Shop 237; Terran_Armory 241; Terran_Starport 295; Terran_Opening rax_fe; Terran_Academy 616; Terran_Bunker -1; Terran_Factory 162; 21 | Terran_Control_Tower 390; Terran_Comsat_Station 365; Terran_Barracks 90; Terran_Expansion 242; Terran_Refinery 103; Terran_Barracks2 213; Terran_Missile_Turret -1; Terran_Supply_Depot 59; Terran_Engineering_Bay -1; Terran_Science_Facility 703; Terran_Machine_Shop 224; Terran_Armory 285; Terran_Starport 344; Terran_Opening rax_fe; Terran_Academy 312; Terran_Bunker -1; Terran_Factory 152; 22 | Terran_Control_Tower 636; Terran_Comsat_Station 619; Terran_Barracks 89; Terran_Expansion 216; Terran_Refinery 103; Terran_Barracks2 970; Terran_Missile_Turret 809; Terran_Supply_Depot 57; Terran_Engineering_Bay 766; Terran_Science_Facility 808; Terran_Machine_Shop 211; Terran_Armory 311; Terran_Starport 559; Terran_Opening rax_fe; Terran_Academy 558; Terran_Bunker -1; Terran_Factory 157; 23 | Terran_Control_Tower 282; Terran_Comsat_Station 779; Terran_Barracks 92; Terran_Expansion 405; Terran_Refinery 108; Terran_Barracks2 358; Terran_Missile_Turret 586; Terran_Supply_Depot 61; Terran_Engineering_Bay 521; Terran_Science_Facility 861; Terran_Machine_Shop 249; Terran_Armory 221; Terran_Starport 230; Terran_Opening rax_fe; Terran_Academy 682; Terran_Bunker -1; Terran_Factory 162; 24 | Terran_Control_Tower 611; Terran_Comsat_Station 512; Terran_Barracks 97; Terran_Expansion 216; Terran_Refinery 104; Terran_Barracks2 -1; Terran_Missile_Turret 993; Terran_Supply_Depot 56; Terran_Engineering_Bay 953; Terran_Science_Facility 905; Terran_Machine_Shop 242; Terran_Armory 622; Terran_Starport 560; Terran_Opening rax_fe; Terran_Academy 458; Terran_Bunker 435; Terran_Factory 167; 25 | Terran_Control_Tower 375; Terran_Comsat_Station 608; Terran_Barracks 100; Terran_Expansion 368; Terran_Refinery 99; Terran_Barracks2 481; Terran_Missile_Turret 726; Terran_Supply_Depot 57; Terran_Engineering_Bay 641; Terran_Science_Facility 0; Terran_Machine_Shop 211; Terran_Armory 593; Terran_Starport 308; Terran_Opening two_facto; Terran_Academy 546; Terran_Bunker -1; Terran_Factory 153; 26 | Terran_Control_Tower 338; Terran_Comsat_Station 387; Terran_Barracks 97; Terran_Expansion 343; Terran_Refinery 103; Terran_Barracks2 -1; Terran_Missile_Turret 440; Terran_Supply_Depot 56; Terran_Engineering_Bay 393; Terran_Science_Facility -1; Terran_Machine_Shop 207; Terran_Armory 378; Terran_Starport 212; Terran_Opening rax_fe; Terran_Academy 311; Terran_Bunker -1; Terran_Factory 154; 27 | Terran_Control_Tower -1; Terran_Comsat_Station 418; Terran_Barracks 88; Terran_Expansion 313; Terran_Refinery 105; Terran_Barracks2 348; Terran_Missile_Turret -1; Terran_Supply_Depot 55; Terran_Engineering_Bay -1; Terran_Science_Facility -1; Terran_Machine_Shop 256; Terran_Armory -1; Terran_Starport 207; Terran_Opening rax_fe; Terran_Academy 339; Terran_Bunker -1; Terran_Factory 154; 28 | Terran_Control_Tower 484; Terran_Comsat_Station 460; Terran_Barracks 92; Terran_Expansion 237; Terran_Refinery 95; Terran_Barracks2 -1; Terran_Missile_Turret -1; Terran_Supply_Depot 58; Terran_Engineering_Bay -1; Terran_Science_Facility -1; Terran_Machine_Shop 216; Terran_Armory 305; Terran_Starport 430; Terran_Opening rax_fe; Terran_Academy 405; Terran_Bunker -1; Terran_Factory 163; 29 | Terran_Control_Tower -1; Terran_Comsat_Station -1; Terran_Barracks -1; Terran_Expansion -1; Terran_Refinery -1; Terran_Barracks2 -1; Terran_Missile_Turret -1; Terran_Supply_Depot 0; Terran_Engineering_Bay -1; Terran_Science_Facility -1; Terran_Machine_Shop -1; Terran_Armory -1; Terran_Starport -1; Terran_Opening ; Terran_Academy -1; Terran_Bunker -1; Terran_Factory -1; 30 | Terran_Control_Tower 677; Terran_Comsat_Station 654; Terran_Barracks 99; Terran_Expansion 236; Terran_Refinery 106; Terran_Barracks2 534; Terran_Missile_Turret -1; Terran_Supply_Depot 59; Terran_Engineering_Bay -1; Terran_Science_Facility -1; Terran_Machine_Shop 274; Terran_Armory 425; Terran_Starport 575; Terran_Opening rax_fe; Terran_Academy 595; Terran_Bunker -1; Terran_Factory 161; 31 | Terran_Control_Tower 440; Terran_Comsat_Station 498; Terran_Barracks 100; Terran_Expansion 236; Terran_Refinery 102; Terran_Barracks2 -1; Terran_Missile_Turret -1; Terran_Supply_Depot 57; Terran_Engineering_Bay 550; Terran_Science_Facility -1; Terran_Machine_Shop 258; Terran_Armory 416; Terran_Starport 387; Terran_Opening rax_fe; Terran_Academy 439; Terran_Bunker -1; Terran_Factory 162; 32 | Terran_Control_Tower -1; Terran_Comsat_Station -1; Terran_Barracks 68; Terran_Expansion -1; Terran_Refinery -1; Terran_Barracks2 -1; Terran_Missile_Turret -1; Terran_Supply_Depot 95; Terran_Engineering_Bay -1; Terran_Science_Facility -1; Terran_Machine_Shop -1; Terran_Armory -1; Terran_Starport -1; Terran_Opening ; Terran_Academy -1; Terran_Bunker 149; Terran_Factory -1; 33 | Terran_Control_Tower 261; Terran_Comsat_Station 346; Terran_Barracks 95; Terran_Expansion 428; Terran_Refinery 102; Terran_Barracks2 247; Terran_Missile_Turret 444; Terran_Supply_Depot 57; Terran_Engineering_Bay 379; Terran_Science_Facility -1; Terran_Machine_Shop 205; Terran_Armory 497; Terran_Starport 211; Terran_Opening rax_fe; Terran_Academy 283; Terran_Bunker -1; Terran_Factory 153; 34 | Terran_Control_Tower 264; Terran_Comsat_Station 410; Terran_Barracks 98; Terran_Expansion 400; Terran_Refinery 97; Terran_Barracks2 -1; Terran_Missile_Turret -1; Terran_Supply_Depot 56; Terran_Engineering_Bay -1; Terran_Science_Facility -1; Terran_Machine_Shop 234; Terran_Armory 583; Terran_Starport 214; Terran_Opening rax_fe; Terran_Academy 351; Terran_Bunker 258; Terran_Factory 159; 35 | Terran_Control_Tower 520; Terran_Comsat_Station 408; Terran_Barracks 84; Terran_Expansion 203; Terran_Refinery 100; Terran_Barracks2 459; Terran_Missile_Turret 644; Terran_Supply_Depot 55; Terran_Engineering_Bay 573; Terran_Science_Facility 617; Terran_Machine_Shop 206; Terran_Armory 264; Terran_Starport 460; Terran_Opening rax_fe; Terran_Academy 350; Terran_Bunker -1; Terran_Factory 154; 36 | Terran_Control_Tower 268; Terran_Comsat_Station 399; Terran_Barracks 95; Terran_Expansion 466; Terran_Refinery 98; Terran_Barracks2 -1; Terran_Missile_Turret 508; Terran_Supply_Depot 52; Terran_Engineering_Bay 429; Terran_Science_Facility -1; Terran_Machine_Shop 379; Terran_Armory 598; Terran_Starport 215; Terran_Opening rax_fe; Terran_Academy 346; Terran_Bunker -1; Terran_Factory 159; 37 | Terran_Control_Tower 385; Terran_Comsat_Station 476; Terran_Barracks 85; Terran_Expansion 236; Terran_Refinery 104; Terran_Barracks2 361; Terran_Missile_Turret 714; Terran_Supply_Depot 58; Terran_Engineering_Bay 646; Terran_Science_Facility 0; Terran_Machine_Shop 240; Terran_Armory 269; Terran_Starport 324; Terran_Opening rax_fe; Terran_Academy 286; Terran_Bunker -1; Terran_Factory 164; 38 | Terran_Control_Tower 545; Terran_Comsat_Station 378; Terran_Barracks 100; Terran_Expansion 267; Terran_Refinery 103; Terran_Barracks2 570; Terran_Missile_Turret 724; Terran_Supply_Depot 58; Terran_Engineering_Bay 579; Terran_Science_Facility 862; Terran_Machine_Shop 228; Terran_Armory 309; Terran_Starport 488; Terran_Opening rax_fe; Terran_Academy 323; Terran_Bunker 288; Terran_Factory 154; 39 | Terran_Control_Tower 366; Terran_Comsat_Station 491; Terran_Barracks 84; Terran_Expansion 446; Terran_Refinery 110; Terran_Barracks2 525; Terran_Missile_Turret 625; Terran_Supply_Depot 56; Terran_Engineering_Bay 582; Terran_Science_Facility 1000; Terran_Machine_Shop 408; Terran_Armory 260; Terran_Starport 308; Terran_Opening rax_fe; Terran_Academy 402; Terran_Bunker 192; Terran_Factory 168; 40 | Terran_Control_Tower 437; Terran_Comsat_Station 354; Terran_Barracks 99; Terran_Expansion 232; Terran_Refinery 103; Terran_Barracks2 401; Terran_Missile_Turret 640; Terran_Supply_Depot 57; Terran_Engineering_Bay 491; Terran_Science_Facility -1; Terran_Machine_Shop 231; Terran_Armory 275; Terran_Starport 380; Terran_Opening rax_fe; Terran_Academy 286; Terran_Bunker 344; Terran_Factory 155; 41 | Terran_Control_Tower -1; Terran_Comsat_Station 557; Terran_Barracks 97; Terran_Expansion 382; Terran_Refinery 104; Terran_Barracks2 -1; Terran_Missile_Turret -1; Terran_Supply_Depot 55; Terran_Engineering_Bay 635; Terran_Science_Facility -1; Terran_Machine_Shop 208; Terran_Armory 410; Terran_Starport -1; Terran_Opening rax_fe; Terran_Academy 491; Terran_Bunker -1; Terran_Factory 155; 42 | Terran_Control_Tower -1; Terran_Comsat_Station -1; Terran_Barracks 99; Terran_Expansion 221; Terran_Refinery 102; Terran_Barracks2 -1; Terran_Missile_Turret -1; Terran_Supply_Depot 57; Terran_Engineering_Bay -1; Terran_Science_Facility -1; Terran_Machine_Shop 255; Terran_Armory -1; Terran_Starport -1; Terran_Opening rax_fe; Terran_Academy -1; Terran_Bunker -1; Terran_Factory 158; 43 | Terran_Control_Tower 677; Terran_Comsat_Station 654; Terran_Barracks 99; Terran_Expansion 236; Terran_Refinery 106; Terran_Barracks2 534; Terran_Missile_Turret -1; Terran_Supply_Depot 59; Terran_Engineering_Bay -1; Terran_Science_Facility -1; Terran_Machine_Shop 274; Terran_Armory 425; Terran_Starport 575; Terran_Opening rax_fe; Terran_Academy 595; Terran_Bunker -1; Terran_Factory 161; 44 | Terran_Control_Tower -1; Terran_Comsat_Station 570; Terran_Barracks 97; Terran_Expansion 231; Terran_Refinery 101; Terran_Barracks2 -1; Terran_Missile_Turret 953; Terran_Supply_Depot 58; Terran_Engineering_Bay 850; Terran_Science_Facility -1; Terran_Machine_Shop 264; Terran_Armory 278; Terran_Starport -1; Terran_Opening rax_fe; Terran_Academy 517; Terran_Bunker -1; Terran_Factory 154; 45 | Terran_Control_Tower 270; Terran_Comsat_Station -1; Terran_Barracks 96; Terran_Expansion 424; Terran_Refinery 103; Terran_Barracks2 -1; Terran_Missile_Turret -1; Terran_Supply_Depot 57; Terran_Engineering_Bay -1; Terran_Science_Facility -1; Terran_Machine_Shop 244; Terran_Armory -1; Terran_Starport 224; Terran_Opening rax_fe; Terran_Academy 481; Terran_Bunker 249; Terran_Factory 153; 46 | Terran_Control_Tower 347; Terran_Comsat_Station 595; Terran_Barracks 90; Terran_Expansion 334; Terran_Refinery 109; Terran_Barracks2 256; Terran_Missile_Turret 733; Terran_Supply_Depot 57; Terran_Engineering_Bay 688; Terran_Science_Facility 658; Terran_Machine_Shop 239; Terran_Armory 532; Terran_Starport 223; Terran_Opening unknown; Terran_Academy 535; Terran_Bunker -1; Terran_Factory 167; 47 | Terran_Control_Tower 584; Terran_Comsat_Station 452; Terran_Barracks 99; Terran_Expansion 223; Terran_Refinery 103; Terran_Barracks2 264; Terran_Missile_Turret 335; Terran_Supply_Depot 58; Terran_Engineering_Bay 294; Terran_Science_Facility -1; Terran_Machine_Shop 218; Terran_Armory 327; Terran_Starport 518; Terran_Opening rax_fe; Terran_Academy 389; Terran_Bunker -1; Terran_Factory 165; 48 | Terran_Control_Tower -1; Terran_Comsat_Station -1; Terran_Barracks 87; Terran_Expansion 204; Terran_Refinery 101; Terran_Barracks2 -1; Terran_Missile_Turret -1; Terran_Supply_Depot 55; Terran_Engineering_Bay -1; Terran_Science_Facility -1; Terran_Machine_Shop 232; Terran_Armory 621; Terran_Starport -1; Terran_Opening rax_fe; Terran_Academy -1; Terran_Bunker -1; Terran_Factory 153; 49 | Terran_Control_Tower 267; Terran_Comsat_Station 453; Terran_Barracks 97; Terran_Expansion 291; Terran_Refinery 101; Terran_Barracks2 -1; Terran_Missile_Turret 419; Terran_Supply_Depot 57; Terran_Engineering_Bay 374; Terran_Science_Facility -1; Terran_Machine_Shop 227; Terran_Armory -1; Terran_Starport 216; Terran_Opening rax_fe; Terran_Academy 376; Terran_Bunker -1; Terran_Factory 153; 50 | Terran_Control_Tower 256; Terran_Comsat_Station 417; Terran_Barracks 102; Terran_Expansion 377; Terran_Refinery 104; Terran_Barracks2 -1; Terran_Missile_Turret -1; Terran_Supply_Depot 60; Terran_Engineering_Bay -1; Terran_Science_Facility -1; Terran_Machine_Shop 234; Terran_Armory -1; Terran_Starport 209; Terran_Opening rax_fe; Terran_Academy 362; Terran_Bunker -1; Terran_Factory 156; 51 | Terran_Control_Tower 489; Terran_Comsat_Station 550; Terran_Barracks 100; Terran_Expansion 365; Terran_Refinery 83; Terran_Barracks2 672; Terran_Missile_Turret 329; Terran_Supply_Depot 58; Terran_Engineering_Bay 286; Terran_Science_Facility 0; Terran_Machine_Shop 214; Terran_Armory 475; Terran_Starport 379; Terran_Opening rax_fe; Terran_Academy 477; Terran_Bunker -1; Terran_Factory 162; 52 | Terran_Control_Tower 522; Terran_Comsat_Station 626; Terran_Barracks 85; Terran_Expansion 375; Terran_Refinery 102; Terran_Barracks2 -1; Terran_Missile_Turret 331; Terran_Supply_Depot 58; Terran_Engineering_Bay 291; Terran_Science_Facility -1; Terran_Machine_Shop 210; Terran_Armory 263; Terran_Starport 391; Terran_Opening rax_fe; Terran_Academy 562; Terran_Bunker -1; Terran_Factory 153; 53 | Terran_Control_Tower 808; Terran_Comsat_Station 639; Terran_Barracks 90; Terran_Expansion 495; Terran_Refinery 105; Terran_Barracks2 426; Terran_Missile_Turret 654; Terran_Supply_Depot 53; Terran_Engineering_Bay 568; Terran_Science_Facility -1; Terran_Machine_Shop 340; Terran_Armory 231; Terran_Starport 703; Terran_Opening two_facto; Terran_Academy 491; Terran_Bunker -1; Terran_Factory 165; 54 | Terran_Control_Tower -1; Terran_Comsat_Station -1; Terran_Barracks 97; Terran_Expansion -1; Terran_Refinery 118; Terran_Barracks2 295; Terran_Missile_Turret 384; Terran_Supply_Depot 59; Terran_Engineering_Bay 325; Terran_Science_Facility -1; Terran_Machine_Shop 307; Terran_Armory 306; Terran_Starport -1; Terran_Opening two_facto; Terran_Academy -1; Terran_Bunker -1; Terran_Factory 189; 55 | Terran_Control_Tower -1; Terran_Comsat_Station -1; Terran_Barracks 90; Terran_Expansion -1; Terran_Refinery 120; Terran_Barracks2 200; Terran_Missile_Turret -1; Terran_Supply_Depot 61; Terran_Engineering_Bay -1; Terran_Science_Facility -1; Terran_Machine_Shop -1; Terran_Armory -1; Terran_Starport -1; Terran_Opening ; Terran_Academy -1; Terran_Bunker -1; Terran_Factory 182; 56 | Terran_Control_Tower -1; Terran_Comsat_Station -1; Terran_Barracks 91; Terran_Expansion -1; Terran_Refinery 119; Terran_Barracks2 199; Terran_Missile_Turret -1; Terran_Supply_Depot 60; Terran_Engineering_Bay -1; Terran_Science_Facility -1; Terran_Machine_Shop -1; Terran_Armory -1; Terran_Starport -1; Terran_Opening bio; Terran_Academy -1; Terran_Bunker -1; Terran_Factory 173; 57 | Terran_Control_Tower 582; Terran_Comsat_Station -1; Terran_Barracks 91; Terran_Expansion 556; Terran_Refinery 102; Terran_Barracks2 588; Terran_Missile_Turret -1; Terran_Supply_Depot 61; Terran_Engineering_Bay 601; Terran_Science_Facility -1; Terran_Machine_Shop 210; Terran_Armory -1; Terran_Starport 224; Terran_Opening two_facto; Terran_Academy -1; Terran_Bunker -1; Terran_Factory 158; 58 | Terran_Control_Tower -1; Terran_Comsat_Station -1; Terran_Barracks 89; Terran_Expansion -1; Terran_Refinery 98; Terran_Barracks2 309; Terran_Missile_Turret -1; Terran_Supply_Depot 57; Terran_Engineering_Bay -1; Terran_Science_Facility -1; Terran_Machine_Shop 203; Terran_Armory -1; Terran_Starport -1; Terran_Opening two_facto; Terran_Academy -1; Terran_Bunker -1; Terran_Factory 151; 59 | Terran_Control_Tower 283; Terran_Comsat_Station 330; Terran_Barracks 90; Terran_Expansion 434; Terran_Refinery 107; Terran_Barracks2 169; Terran_Missile_Turret 1018; Terran_Supply_Depot 59; Terran_Engineering_Bay 471; Terran_Science_Facility -1; Terran_Machine_Shop 309; Terran_Armory -1; Terran_Starport 226; Terran_Opening rax_fe; Terran_Academy 274; Terran_Bunker -1; Terran_Factory 171; 60 | -------------------------------------------------------------------------------- /techtrees.h: -------------------------------------------------------------------------------- 1 | #include 2 | #include "parameters.h" 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include "enums_name_tables_tt.h" 9 | #include "x_values.h" 10 | #include "replays.h" 11 | #include 12 | #include 13 | #include 14 | #include 15 | 16 | /// Copyright Gabriel Synnaeve 2011 17 | /// This code is under 3-clauses (new) BSD License 18 | 19 | typedef void iovoid; 20 | 21 | class TechTreePredictor 22 | { 23 | /// Variables specification 24 | plSymbol X; // Build Tree 25 | std::vector observed; 26 | plSymbol lambda; 27 | #ifdef DIRAC_ON_LAST_X 28 | plSymbol LastX; 29 | #endif 30 | plSymbol Time; 31 | /// Parametric forms specification 32 | #ifdef DIRAC_ON_LAST_X 33 | plMutableDistribution P_LastX; 34 | plExternalFunction same_x; 35 | plFunctionalDirac P_X; 36 | #else 37 | plProbTable P_X; 38 | #endif 39 | plCndLearnObject xLearner; 40 | plComputableObjectList listObs; 41 | std::vector P_Observed; 42 | plVariablesConjunction ObsConj; 43 | plVariablesConjunction X_Obs_conj; 44 | plExternalFunction coherence; 45 | plFunctionalDirac P_lambda; 46 | plCndLearnObject timeLearner; 47 | /// Decomposition 48 | plVariablesConjunction knownConj; 49 | plJointDistribution jd; 50 | /// Program Question 51 | #if PLOT > 1 52 | plVariablesConjunction X_Op; 53 | plCndDistribution Cnd_P_Time_X_knowing_Op; 54 | #if PLOT > 2 55 | plCndDistribution Cnd_P_Time_knowing_X_Op; 56 | #endif 57 | #endif 58 | plCndDistribution Cnd_P_X_knowing_obs; 59 | 60 | #ifdef BENCH 61 | unsigned int positive_classif_finale; 62 | unsigned int positive_classif_online; 63 | unsigned int positive_classif_online_after; 64 | unsigned int cpositive_classif_finale; 65 | std::map cumulative_prob; 66 | unsigned int times_label_predicted; 67 | unsigned int times_label_predicted_after; 68 | std::vector time_taken_prediction; 69 | #endif 70 | 71 | // Game wise computations 72 | plValues evidence; 73 | #if PLOT > 0 74 | std::vector tmpProbV; 75 | #endif 76 | 77 | public: 78 | plDistribution T_P_X; 79 | TechTreePredictor(const std::vector& op, 80 | const char* learningFileName); 81 | ~TechTreePredictor(); 82 | void init_game(); 83 | int instantiate_and_compile(int time, 84 | const Building& building); 85 | int quit_game(int noreplay); 86 | void results(int noreplay); 87 | }; 88 | -------------------------------------------------------------------------------- /test_functional_dirac.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | void test_X_possible(plValues& lambda, const plValues& X_and_Y) 5 | { 6 | // if X is possible w.r.t. observations 7 | if (X_and_Y[0] == X_and_Y[1]) 8 | lambda[0] = 1; // true 9 | else 10 | lambda[0] = 0; // false 11 | } 12 | 13 | int main() 14 | { 15 | plSymbol X("X", PL_BINARY_TYPE); 16 | plSymbol Y("Y", PL_BINARY_TYPE); 17 | plSymbol lambda("lambda", PL_BINARY_TYPE); 18 | 19 | plProbValue tmp_table[] = {0.5, 0.5}; 20 | plProbTable P_X(X, tmp_table, true); 21 | plProbTable P_Y(Y, tmp_table, true); 22 | plExternalFunction coherence(lambda, X^Y, test_X_possible); 23 | plFunctionalDirac P_lambda(lambda, X^Y, coherence); 24 | plJointDistribution jd(lambda^X^Y, P_X*P_Y*P_lambda); 25 | plCndDistribution Cnd_lambda_knowing_X_Y; 26 | jd.ask(Cnd_lambda_knowing_X_Y, lambda, X^Y); 27 | plValues evidence(X^Y); 28 | evidence[X] = true; 29 | evidence[Y] = true; 30 | plDistribution P_lambda_knowing_X_Y; 31 | Cnd_lambda_knowing_X_Y.instantiate(P_lambda_knowing_X_Y, evidence); 32 | plDistribution T_P_lambda; 33 | P_lambda_knowing_X_Y.compile(T_P_lambda); 34 | std::cout << T_P_lambda << std::endl; 35 | evidence[X] = false; 36 | evidence[Y] = true; 37 | Cnd_lambda_knowing_X_Y.instantiate(P_lambda_knowing_X_Y, evidence); 38 | P_lambda_knowing_X_Y.compile(T_P_lambda); 39 | std::cout << T_P_lambda << std::endl; 40 | } 41 | -------------------------------------------------------------------------------- /test_getBuildings.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include "x_values.h" 4 | #include "replays.h" 5 | 6 | using namespace std; 7 | 8 | void mapPrint(const multimap& m) 9 | { 10 | for (multimap::const_iterator it = m.begin(); 11 | it != m.end(); ++it) 12 | { 13 | cout << "Time: " << it->first << ", Building: " 14 | << it->second << endl; 15 | } 16 | } 17 | 18 | int main(int argc, const char *argv[]) 19 | { 20 | string input; 21 | while (cin) 22 | { 23 | getline(cin, input); 24 | string tmpOpening = pruneOpeningVal(input); 25 | if (tmpOpening != "") 26 | { 27 | multimap tmpBuildings; 28 | getBuildings(input, tmpBuildings); 29 | mapPrint(tmpBuildings); 30 | } 31 | } 32 | return 0; 33 | } 34 | -------------------------------------------------------------------------------- /test_getOpeningVal.cpp: -------------------------------------------------------------------------------- 1 | #include "x_values.h" 2 | #include "replays.h" 3 | 4 | using namespace std; 5 | 6 | int main(int argc, const char *argv[]) 7 | { 8 | string input; 9 | while(cin) 10 | { 11 | getline(cin, input); 12 | if (input.empty()) 13 | return 0; 14 | cout << pruneOpeningVal(input); 15 | } 16 | return 0; 17 | } 18 | -------------------------------------------------------------------------------- /test_lambda.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include "enums_name_tables.h" 7 | #include "x_values.h" 8 | 9 | #define PRINT 10 | 11 | using namespace std; 12 | 13 | //P(lambda|X Protoss_Nexus Protoss_Expansion Protoss_Robotics_Facility Protoss_Pylon Protoss_Pylon2 Protoss_Assimilator Protoss_Observatory Protoss_Gateway Protoss_Gateway2 Protoss_Photon_Cannon Protoss_Citadel_of_Adun Protoss_Cybernetics_Core Protoss_Templar_Archives Protoss_Forge Protoss_Stargate Protoss_Fleet_Beacon Protoss_Arbiter_Tribunal Protoss_Robotics_Support_Bay Protoss_Shield_Battery) 14 | 15 | 16 | std::vector > protoss_X; 17 | 18 | void test_X_possible(plValues& lambda, const plValues& X_Obs_conj) 19 | { 20 | set setX = protoss_X[X_Obs_conj[0]]; 21 | #ifdef PRINT 22 | ///////////// print 23 | cout << ">>> setX: "; 24 | for (set::const_iterator ibn 25 | = setX.begin(); 26 | ibn != setX.end(); ++ibn) 27 | { 28 | cout << protoss_buildings_name[*ibn] << ", "; 29 | } 30 | cout << endl; 31 | ///////////// 32 | #endif 33 | 34 | set setObs; 35 | set intersect; 36 | //for (plValues::const_iterator it = X_Obs_conj.begin(); ...) 37 | for (unsigned int i = 1; i <= NB_PROTOSS_BUILDINGS; ++i) 38 | { 39 | if (X_Obs_conj[i]) 40 | { 41 | setObs.insert(i-1); 42 | if (setX.count(i-1)) 43 | intersect.insert(i-1); 44 | } 45 | } 46 | #ifdef PRINT 47 | ///////////// print 48 | cout << ">>> setObs: "; 49 | for (set::const_iterator ibn 50 | = setObs.begin(); 51 | ibn != setObs.end(); ++ibn) 52 | { 53 | cout << protoss_buildings_name[*ibn] << ", "; 54 | } 55 | cout << endl; 56 | ///////////// 57 | #endif 58 | 59 | vector difference(setObs.size()); 60 | vector::iterator it = 61 | set_difference(setObs.begin(), setObs.end(), 62 | intersect.begin(), intersect.end(), 63 | difference.begin()); 64 | if (difference.begin() == it) 65 | { 66 | lambda[0] = 1; // true 67 | } 68 | else 69 | { 70 | lambda[0] = 0; // false 71 | } 72 | } 73 | 74 | int main(int argc, const char *argv[]) 75 | { 76 | ifstream fin("PvP.txt"); 77 | #ifdef GENERATE_X_VALUES 78 | protoss_X = get_X_values(fin); 79 | #else 80 | protoss_X = tech_trees(fin).vector_X; 81 | #endif 82 | 83 | plSymbol X("X", plIntegerType(0, protoss_X.size())); 84 | std::vector observed; 85 | plSymbol lambda("lambda", PL_BINARY_TYPE); 86 | for (unsigned int i = 0; i < NB_PROTOSS_BUILDINGS; i++) 87 | { 88 | // what has been observed 89 | observed.push_back(plSymbol(protoss_buildings_name[i], PL_BINARY_TYPE)); 90 | } 91 | 92 | // P(X) (possible tech trees) 93 | std::vector tableX; 94 | for (unsigned int i = 0; i < protoss_X.size(); i++) 95 | tableX.push_back(1.0); // TOLEARN 96 | plProbTable P_X(X, tableX, false); 97 | 98 | // P(O_1..NB_PROTOSS_BUILDINGS) 99 | plComputableObjectList listObs; 100 | std::vector P_Observed; 101 | plProbValue tmp_table[] = {0.5, 0.5}; // TOLEARN (per observation) 102 | for (unsigned int i = 0; i < NB_PROTOSS_BUILDINGS; i++) 103 | { 104 | P_Observed.push_back(plProbTable(observed[i], tmp_table, true)); 105 | listObs *= plProbTable(observed[i], tmp_table, true); 106 | } 107 | 108 | // P_lambda 109 | plVariablesConjunction ObsConj; 110 | for (std::vector::const_iterator it = observed.begin(); 111 | it != observed.end(); ++it) 112 | ObsConj ^= (*it); 113 | plVariablesConjunction X_Obs_conj = X^ObsConj; 114 | plExternalFunction coherence(lambda, X_Obs_conj, test_X_possible); 115 | plFunctionalDirac P_lambda(lambda, X_Obs_conj , coherence); 116 | 117 | plJointDistribution jd(lambda^X_Obs_conj, P_lambda*P_X*listObs); 118 | plCndDistribution Cnd_P_lambda_knowing_ObsConj; 119 | jd.ask(Cnd_P_lambda_knowing_ObsConj, lambda, ObsConj); 120 | cout << jd.ask(lambda, ObsConj) << endl; 121 | 122 | //Protoss_Nexus Protoss_Expansion Protoss_Robotics_Facility Protoss_Pylon Protoss_Pylon2 Protoss_Assimilator Protoss_Observatory Protoss_Gateway Protoss_Gateway2 Protoss_Photon_Cannon Protoss_Citadel_of_Adun Protoss_Cybernetics_Core Protoss_Templar_Archives Protoss_Forge Protoss_Stargate Protoss_Fleet_Beacon Protoss_Arbiter_Tribunal Protoss_Robotics_Support_Bay Protoss_Shield_Battery = 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 123 | plValues evidence(ObsConj); 124 | unsigned int i = 0; 125 | evidence[i++] = 1; 126 | evidence[i++] = 0; 127 | evidence[i++] = 0; 128 | evidence[i++] = 1; 129 | evidence[i++] = 0; 130 | evidence[i++] = 1; 131 | evidence[i++] = 0; 132 | evidence[i++] = 0; 133 | evidence[i++] = 0; 134 | evidence[i++] = 0; 135 | evidence[i++] = 0; 136 | evidence[i++] = 0; 137 | evidence[i++] = 0; 138 | evidence[i++] = 0; 139 | evidence[i++] = 0; 140 | evidence[i++] = 0; 141 | evidence[i++] = 0; 142 | evidence[i++] = 0; 143 | evidence[i++] = 0; 144 | plDistribution D_lambda; 145 | Cnd_P_lambda_knowing_ObsConj.instantiate(D_lambda, evidence); 146 | 147 | cout << ">>> Distribution of Lambda: " << endl; 148 | 149 | cout << D_lambda.compile() << endl; 150 | 151 | return 0; 152 | } 153 | -------------------------------------------------------------------------------- /test_learning.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include "enums_name_tables.h" 7 | #include "x_values.h" 8 | #include "replays.h" 9 | 10 | using namespace std; 11 | 12 | int main(int argc, const char *argv[]) 13 | { 14 | vector vector_X; 15 | vector_X.push_back(0); 16 | vector_X.push_back(1); 17 | vector_X.push_back(2); 18 | std::vector openings; 19 | openings.push_back("Op0"); 20 | openings.push_back("Op1"); 21 | 22 | plSymbol X("X", plIntegerType(0, vector_X.size())); 23 | std::vector tableX; 24 | for (unsigned int i = 0; i < vector_X.size(); i++) 25 | tableX.push_back(1.0); // TOLEARN 26 | plProbTable P_X(X, tableX, false); 27 | 28 | plSymbol Opening("Opening", plLabelType(openings)); 29 | std::vector tableOpening; 30 | for (unsigned int i = 0; i < openings.size(); i++) 31 | tableOpening.push_back(1.0); // TOLEARN 32 | plProbTable P_Opening(Opening, tableOpening, false); 33 | 34 | plSymbol Time("Time", plIntegerType(1,300)); // 18 minutes 35 | 36 | plCndLearnObject timeLearner(Time, X^Opening); 37 | 38 | plValues vals(timeLearner.get_variables()); 39 | 40 | vals[Opening] = "Op0"; 41 | vals[X] = 0; 42 | vals[Time] = 30; 43 | if (!timeLearner.add_point(vals)) 44 | cout << "ERROR: point not added" << endl; 45 | vals.reset(); 46 | vals[Opening] = "Op0"; 47 | vals[X] = 0; 48 | vals[Time] = 32; 49 | if (!timeLearner.add_point(vals)) 50 | cout << "ERROR: point not added" << endl; 51 | vals.reset(); 52 | vals[Opening] = "Op0"; 53 | vals[X] = 0; 54 | vals[Time] = 35; 55 | if (!timeLearner.add_point(vals)) 56 | cout << "ERROR: point not added" << endl; 57 | vals.reset(); 58 | vals[Opening] = "Op0"; 59 | vals[X] = 0; 60 | vals[Time] = 28; 61 | if (!timeLearner.add_point(vals)) 62 | cout << "ERROR: point not added" << endl; 63 | vals.reset(); 64 | vals[Opening] = "Op1"; 65 | vals[X] = 0; 66 | vals[Time] = 35; 67 | if (!timeLearner.add_point(vals)) 68 | cout << "ERROR: point not added" << endl; 69 | vals.reset(); 70 | vals[Opening] = "Op1"; 71 | vals[X] = 0; 72 | vals[Time] = 37; 73 | if (!timeLearner.add_point(vals)) 74 | cout << "ERROR: point not added" << endl; 75 | vals.reset(); 76 | vals[Opening] = "Op1"; 77 | vals[X] = 0; 78 | vals[Time] = 34; 79 | if (!timeLearner.add_point(vals)) 80 | cout << "ERROR: point not added" << endl; 81 | vals.reset(); 82 | vals[Opening] = "Op1"; 83 | vals[X] = 0; 84 | vals[Time] = 38; 85 | if (!timeLearner.add_point(vals)) 86 | cout << "ERROR: point not added" << endl; 87 | vals.reset(); 88 | vals[Opening] = "Op0"; 89 | vals[X] = 1; 90 | vals[Time] = 60; 91 | if (!timeLearner.add_point(vals)) 92 | cout << "ERROR: point not added" << endl; 93 | vals.reset(); 94 | vals[Opening] = "Op0"; 95 | vals[X] = 1; 96 | vals[Time] = 55; 97 | if (!timeLearner.add_point(vals)) 98 | cout << "ERROR: point not added" << endl; 99 | vals.reset(); 100 | vals[Opening] = "Op0"; 101 | vals[X] = 1; 102 | vals[Time] = 62; 103 | if (!timeLearner.add_point(vals)) 104 | cout << "ERROR: point not added" << endl; 105 | vals.reset(); 106 | vals[Opening] = "Op0"; 107 | vals[X] = 1; 108 | vals[Time] = 65; 109 | if (!timeLearner.add_point(vals)) 110 | cout << "ERROR: point not added" << endl; 111 | vals.reset(); 112 | vals[Opening] = "Op0"; 113 | vals[X] = 2; 114 | vals[Time] = 140; 115 | if (!timeLearner.add_point(vals)) 116 | cout << "ERROR: point not added" << endl; 117 | vals.reset(); 118 | vals[Opening] = "Op0"; 119 | vals[X] = 2; 120 | vals[Time] = 130; 121 | if (!timeLearner.add_point(vals)) 122 | cout << "ERROR: point not added" << endl; 123 | vals.reset(); 124 | vals[Opening] = "Op0"; 125 | vals[X] = 2; 126 | vals[Time] = 145; 127 | if (!timeLearner.add_point(vals)) 128 | cout << "ERROR: point not added" << endl; 129 | vals.reset(); 130 | vals[Opening] = "Op0"; 131 | vals[X] = 2; 132 | vals[Time] = 155; 133 | if (!timeLearner.add_point(vals)) 134 | cout << "ERROR: point not added" << endl; 135 | vals.reset(); 136 | 137 | plVariablesConjunction X_Op = X^Opening; 138 | plJointDistribution jd(Time^X_Op, 139 | timeLearner.get_computable_object()*P_X*P_Opening); 140 | 141 | plCndDistribution Cnd_P_Time_knowing_X_Op; 142 | jd.ask(Cnd_P_Time_knowing_X_Op, Time, X_Op); 143 | plValues evidence(X_Op); 144 | evidence[X] = 0; 145 | evidence[Opening] = "Op0"; 146 | plDistribution P_Time; 147 | Cnd_P_Time_knowing_X_Op.instantiate(evidence).compile(P_Time); 148 | P_Time.plot("test_Time.gnuplot"); 149 | 150 | plCndDistribution Cnd_P_Time_knowing_X; 151 | jd.ask(Cnd_P_Time_knowing_X_Op, Time^X, Opening); 152 | plValues evidence2(Opening); 153 | evidence2[Opening] = "Op0"; 154 | plDistribution P_Time_X; 155 | Cnd_P_Time_knowing_X_Op.instantiate(evidence2).compile(P_Time_X); 156 | P_Time_X.plot("test_Time_X.gnuplot"); 157 | 158 | for (unsigned int i = 0; i < 3; i++) 159 | { 160 | plValues rightValues(X^Opening); 161 | rightValues[Opening] = "Op0"; 162 | rightValues[X] = i; 163 | cout << "Learnt parameters, mu: " 164 | << static_cast(timeLearner.get_learnt_object_for_value( 165 | rightValues)->get_distribution()).mean() 166 | << ", stddev: " 167 | << static_cast(timeLearner.get_learnt_object_for_value( 168 | rightValues)->get_distribution()).standard_deviation() 169 | << endl; 170 | } 171 | 172 | return 0; 173 | } 174 | -------------------------------------------------------------------------------- /test_x_values.cpp: -------------------------------------------------------------------------------- 1 | #include "x_values.h" 2 | #include "enums_name_tables.h" 3 | #include 4 | #include 5 | #include 6 | 7 | #define PRINTALL 8 | #define FILE_OUTPUT 9 | #ifdef FILE_OUTPUT 10 | #include 11 | #endif 12 | 13 | 14 | template 15 | #ifdef FILE_OUTPUT 16 | void print_set(const std::set& s, std::ofstream& fout) 17 | #else 18 | void print_set(const std::set& s) 19 | #endif 20 | { 21 | for (std::set::const_iterator it = s.begin(); it != s.end(); ++it) 22 | { 23 | Building tmpBuilding(static_cast(*it)); 24 | #ifdef FILE_OUTPUT 25 | fout << tmpBuilding << " "; 26 | #else 27 | std::cout << tmpBuilding << " "; 28 | #endif 29 | } 30 | #ifdef FILE_OUTPUT 31 | fout << std::endl; 32 | #else 33 | std::cout << std::endl; 34 | #endif 35 | } 36 | 37 | int main(int argc, char* argv[]) 38 | { 39 | std::ifstream fin1("lTall.txt"); /// all protoss matches 40 | std::ifstream fin2("lPall.txt"); /// all protoss matches 41 | std::ifstream fin3("lZall.txt"); /// all protoss matches 42 | #ifdef GENERATE_X_VALUES 43 | std::vector > terran = get_X_values(fin1); 44 | std::vector > protoss = get_X_values(fin2); 45 | std::vector > zerg = get_X_values(fin3); 46 | #else 47 | std::vector > terran = tech_trees(fin1).vector_X; 48 | std::vector > protoss = tech_trees(fin2).vector_X; 49 | std::vector > zerg = tech_trees(fin3).vector_X; 50 | #endif 51 | #ifdef FILE_OUTPUT 52 | std::ofstream terran_fout("terran_possible_tech_trees.txt"); 53 | std::ofstream protoss_fout("protoss_possible_tech_trees.txt"); 54 | std::ofstream zerg_fout("zerg_possible_tech_trees.txt"); 55 | #endif 56 | 57 | std::set > terran_verif; 58 | for (std::vector >::const_iterator it 59 | = terran.begin(); it != terran.end(); ++it) 60 | { 61 | #ifdef PRINTALL 62 | #ifdef FILE_OUTPUT 63 | print_set(*it, terran_fout); 64 | #else 65 | print_set(*it); 66 | #endif 67 | #endif 68 | terran_verif.insert(*it); 69 | } 70 | 71 | if (terran.size() != terran_verif.size()) 72 | std::cout << "TEST FAIL" << std::endl; 73 | std::cout << "Terran, printed: " << terran.size() << " sets == tech trees" << std::endl; 74 | 75 | std::set > protoss_verif; 76 | for (std::vector >::const_iterator it 77 | = protoss.begin(); it != protoss.end(); ++it) 78 | { 79 | #ifdef PRINTALL 80 | #ifdef FILE_OUTPUT 81 | print_set(*it, protoss_fout); 82 | #else 83 | print_set(*it); 84 | #endif 85 | #endif 86 | protoss_verif.insert(*it); 87 | } 88 | 89 | if (protoss.size() != protoss_verif.size()) 90 | std::cout << "TEST FAIL" << std::endl; 91 | std::cout << "Protoss, printed: " << protoss.size() << " sets == tech trees" << std::endl; 92 | 93 | std::set > zerg_verif; 94 | for (std::vector >::const_iterator it 95 | = zerg.begin(); it != zerg.end(); ++it) 96 | { 97 | #ifdef PRINTALL 98 | #ifdef FILE_OUTPUT 99 | print_set(*it, zerg_fout); 100 | #else 101 | print_set(*it); 102 | #endif 103 | #endif 104 | zerg_verif.insert(*it); 105 | } 106 | 107 | if (zerg.size() != zerg_verif.size()) 108 | { 109 | std::cout << "TEST FAIL" << std::endl; 110 | std::cout << zerg.size() << " " << zerg_verif.size() << std::endl; 111 | } 112 | std::cout << "Zerg, printed: " << zerg.size() << " sets == tech trees" << std::endl; 113 | 114 | return 0; 115 | } 116 | 117 | -------------------------------------------------------------------------------- /tests/lPvPPP: -------------------------------------------------------------------------------- 1 | Protoss_Pylon2 129; Protoss_Pylon 52; Protoss_Opening FastObs; Protoss_Assimilator 138; 2 | Protoss_Pylon2 131; Protoss_Pylon 54; Protoss_Opening FastObs; Protoss_Assimilator 141; 3 | Protoss_Pylon2 132; Protoss_Pylon 49; Protoss_Opening FastExpand; Protoss_Assimilator 219; 4 | Protoss_Pylon2 139; Protoss_Pylon 51; Protoss_Opening FastExpand; Protoss_Assimilator 103; 5 | Protoss_Pylon2 134; Protoss_Pylon 49; Protoss_Opening FastObs; Protoss_Assimilator 97; 6 | Protoss_Pylon2 161; Protoss_Pylon 50; Protoss_Opening FastExpand; Protoss_Assimilator 156; 7 | Protoss_Pylon2 136; Protoss_Pylon 49; Protoss_Opening FastObs; Protoss_Assimilator 107; 8 | Protoss_Pylon2 80; Protoss_Pylon 29; Protoss_Opening FastExpand; Protoss_Assimilator 57; 9 | Protoss_Pylon2 52; Protoss_Pylon 14; Protoss_Opening FastExpand; Protoss_Assimilator 32; 10 | -------------------------------------------------------------------------------- /tests/tPvPPP: -------------------------------------------------------------------------------- 1 | Protoss_Pylon2 129; Protoss_Pylon 52; Protoss_Opening FastObs; Protoss_Assimilator 138; 2 | Protoss_Pylon2 131; Protoss_Pylon 54; Protoss_Opening FastObs; Protoss_Assimilator 141; 3 | Protoss_Pylon2 132; Protoss_Pylon 49; Protoss_Opening FastExpand; Protoss_Assimilator 219; 4 | Protoss_Pylon2 139; Protoss_Pylon 51; Protoss_Opening FastExpand; Protoss_Assimilator 103; 5 | Protoss_Pylon2 134; Protoss_Pylon 49; Protoss_Opening FastObs; Protoss_Assimilator 97; 6 | Protoss_Pylon2 161; Protoss_Pylon 50; Protoss_Opening FastExpand; Protoss_Assimilator 156; 7 | Protoss_Pylon2 136; Protoss_Pylon 49; Protoss_Opening FastObs; Protoss_Assimilator 107; 8 | Protoss_Pylon2 80; Protoss_Pylon 29; Protoss_Opening FastExpand; Protoss_Assimilator 57; 9 | Protoss_Pylon2 52; Protoss_Pylon 14; Protoss_Opening FastExpand; Protoss_Assimilator 32; 10 | -------------------------------------------------------------------------------- /update_model.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syhw/OpeningTech/296ac9b012a99d4de5d29cbf2747f6474776f3ed/update_model.pdf -------------------------------------------------------------------------------- /x_values.h: -------------------------------------------------------------------------------- 1 | #ifndef X_VALUES 2 | #define X_VALUES 3 | #include "parameters.h" 4 | #include 5 | #include 6 | #include 7 | #include "enums_name_tables.h" 8 | 9 | /// Copyright Gabriel Synnaeve 2011 10 | /// This code is under 3-clauses (new) BSD License 11 | 12 | #ifdef GENERATE_X_VALUES 13 | 14 | #include 15 | 16 | std::vector > get_terran_X_values() 17 | { 18 | std::vector > ret_vector; 19 | 20 | for(int expand = 0; expand <= 1; expand++) { 21 | for(int supply = 0; supply <= 1; supply++) { 22 | for(int ref = 0; ref <= 1; ref++) { 23 | for(int rax = 0; rax <= 1; rax++) { 24 | for(int rax2 = 0; rax2 <= 1; rax2++) { 25 | for(int bunker = 0; bunker == 0 || (bunker <= 1 && rax); bunker++) { 26 | for(int ebay = 0; ebay == 0 || (ebay <= 1 && rax); ebay++) { 27 | for(int missile_turret = 0; missile_turret == 0 || (missile_turret <= 1 && ebay); missile_turret++) { 28 | for(int academy = 0; academy == 0 || (academy <= 1 && rax && ref); academy++) { // && supply ? 29 | for(int cs = 0 ; cs == 0 || (cs <= 1 && academy); cs++) { 30 | for(int facto = 0; facto == 0 || (facto <= 1 && rax && ref); facto++) { // && supply ? 31 | for(int armory = 0; armory == 0 || (armory <= 1 && facto); armory++) { 32 | for(int machine_shop = 0; machine_shop == 0 || (machine_shop <= 1 && facto); machine_shop++) { 33 | for(int starport = 0; starport == 0 || (starport <= 1 && facto); starport++) { 34 | for(int control_tower = 0; control_tower == 0 || (control_tower <= 1 && starport); control_tower++) { 35 | for(int science = 0; science == 0 || (science <= 1 && starport); science++) { // && facto ;) 36 | for(int covert = 0; covert == 0 || (covert <= 1 && science); covert++) { 37 | for(int ns = 0; ns == 0 || (ns <= 1 && covert); ns++) { 38 | for(int physics = 0; physics == 0 || (physics <= 1 && science); physics++) { 39 | 40 | std::set tmp_set; 41 | tmp_set.insert((Terran_Buildings)0); // CC 42 | tmp_set.insert((Terran_Buildings)(expand*Terran_Expansion)); 43 | tmp_set.insert((Terran_Buildings)(cs*Terran_Comsat_Station)); 44 | tmp_set.insert((Terran_Buildings)(ns*Terran_Nuclear_Silo)); 45 | tmp_set.insert((Terran_Buildings)(supply*Terran_Supply_Depot)); 46 | tmp_set.insert((Terran_Buildings)(ref*Terran_Refinery)); 47 | tmp_set.insert((Terran_Buildings)(rax*Terran_Barracks)); 48 | tmp_set.insert((Terran_Buildings)(rax2*Terran_Barracks2)); 49 | tmp_set.insert((Terran_Buildings)(academy*Terran_Academy)); 50 | tmp_set.insert((Terran_Buildings)(facto*Terran_Factory)); 51 | tmp_set.insert((Terran_Buildings)(starport*Terran_Starport)); 52 | tmp_set.insert((Terran_Buildings)(control_tower*Terran_Control_Tower)); 53 | tmp_set.insert((Terran_Buildings)(science*Terran_Science_Facility)); 54 | tmp_set.insert((Terran_Buildings)(covert*Terran_Covert_Ops)); 55 | tmp_set.insert((Terran_Buildings)(physics*Terran_Physics_Lab)); 56 | tmp_set.insert((Terran_Buildings)(machine_shop*Terran_Machine_Shop)); 57 | tmp_set.insert((Terran_Buildings)(ebay*Terran_Engineering_Bay)); 58 | tmp_set.insert((Terran_Buildings)(armory*Terran_Armory)); 59 | tmp_set.insert((Terran_Buildings)(missile_turret*Terran_Missile_Turret)); 60 | tmp_set.insert((Terran_Buildings)(bunker*Terran_Bunker)); 61 | ret_vector.push_back(tmp_set); 62 | 63 | }}}}}}}}}}}}}}}}}}} 64 | return ret_vector; 65 | } 66 | 67 | std::vector > get_protoss_X_values() 68 | { 69 | std::vector > ret_vector; 70 | 71 | for(int expand = 0; expand <= 1; expand++) { 72 | for(int pylon = 0; pylon <= 1; pylon++) { 73 | for(int pylon2 = 0; pylon2 <= 1; pylon2++) { 74 | for(int assim = 0; assim <= 1; assim++) { 75 | for(int gate = 0; gate == 0 || (gate == 1 && pylon); gate++) { 76 | for(int gate2 = 0; gate2 == 0 || (gate2 == 1 && pylon); gate2++) { 77 | for(int shield = 0; shield == 0 || (shield == 1 && gate); shield++) { 78 | for(int cyber = 0; cyber == 0 || (cyber == 1 && gate); cyber++) { 79 | for(int citadel = 0; citadel == 0 || (citadel == 1 && cyber && assim); citadel++) { 80 | for(int archives = 0; archives == 0 || (archives == 1 && citadel); archives++) { 81 | for(int robo = 0; robo == 0 || (robo == 1 && cyber && assim); robo++) { 82 | for(int bay = 0; bay == 0 || (bay == 1 && robo); bay++) { 83 | for(int obs = 0; obs == 0 || (obs == 1 && robo); obs++) { 84 | for(int stargate = 0; stargate == 0 || (stargate == 1 && cyber && assim); stargate++) { 85 | for(int beacon = 0; beacon == 0 || (beacon == 1 && stargate); beacon++) { 86 | for(int tribunal = 0; tribunal == 0 || (tribunal == 1 && stargate); tribunal++) { 87 | for(int forge = 0; forge <= 1; forge++) { 88 | for(int photon = 0; photon == 0 || (photon == 1 && forge); photon++) { 89 | 90 | std::set tmp_set; 91 | tmp_set.insert((Protoss_Buildings)0); // Nexus 92 | tmp_set.insert((Protoss_Buildings)(expand*Protoss_Expansion)); 93 | tmp_set.insert((Protoss_Buildings)(robo*Protoss_Robotics_Facility)); 94 | tmp_set.insert((Protoss_Buildings)(pylon*Protoss_Pylon)); 95 | tmp_set.insert((Protoss_Buildings)(pylon2*Protoss_Pylon2)); 96 | tmp_set.insert((Protoss_Buildings)(assim*Protoss_Assimilator)); 97 | tmp_set.insert((Protoss_Buildings)(obs*Protoss_Observatory)); 98 | tmp_set.insert((Protoss_Buildings)(gate*Protoss_Gateway)); 99 | tmp_set.insert((Protoss_Buildings)(gate2*Protoss_Gateway2)); 100 | tmp_set.insert((Protoss_Buildings)(photon*Protoss_Photon_Cannon)); 101 | tmp_set.insert((Protoss_Buildings)(citadel*Protoss_Citadel_of_Adun)); 102 | tmp_set.insert((Protoss_Buildings)(cyber*Protoss_Cybernetics_Core)); 103 | tmp_set.insert((Protoss_Buildings)(archives*Protoss_Templar_Archives)); 104 | tmp_set.insert((Protoss_Buildings)(forge*Protoss_Forge)); 105 | tmp_set.insert((Protoss_Buildings)(stargate*Protoss_Stargate)); 106 | tmp_set.insert((Protoss_Buildings)(beacon*Protoss_Fleet_Beacon)); 107 | tmp_set.insert((Protoss_Buildings)(tribunal*Protoss_Arbiter_Tribunal)); 108 | tmp_set.insert((Protoss_Buildings)(bay*Protoss_Robotics_Support_Bay)); 109 | tmp_set.insert((Protoss_Buildings)(shield*Protoss_Shield_Battery)); 110 | ret_vector.push_back(tmp_set); 111 | 112 | }}}}}}}}}}}}}}}}}} 113 | return ret_vector; 114 | } 115 | 116 | std::vector > get_zerg_X_values() 117 | { 118 | std::vector > ret_vector; 119 | 120 | for(int expand = 0; expand <= 1; expand++) { 121 | for(int expand2 = 0; expand2 <= 1; expand2++) { 122 | for(int overlord = 0; overlord <= 1; overlord++) { 123 | for(int extractor = 0; extractor <= 1; extractor++) { 124 | for(int creep_colony = 0; creep_colony <= 1; creep_colony++) { 125 | for(int pool = 0; pool <= 1; pool++) { 126 | for(int sunken = 0; sunken == 0 || (sunken == 1 && pool); sunken++) { // && creep_colony 127 | for(int hydraden = 0; hydraden == 0 || (hydraden == 1 && pool && extractor); hydraden++) { 128 | for(int lair = 0; lair == 0 || (lair == 1 && pool && extractor); lair++) { 129 | for(int spire = 0; spire == 0 || (spire == 1 && lair); spire++) { 130 | for(int nest = 0; nest == 0 || (nest == 1 && lair); nest++) { 131 | //for(int infestedcc = 0; infestedcc == 0 || (infestedcc == 1 && nest); infestedcc++) { 132 | for(int hive = 0; hive == 0 || (hive == 1 && nest); hive++) { 133 | for(int nydus = 0; nydus == 0 || (nydus == 1 && hive); nydus++) { 134 | for(int defiler_mound = 0; defiler_mound == 0 || (defiler_mound == 1 && hive); defiler_mound++) { 135 | for(int greater_spire = 0; greater_spire == 0 || (greater_spire == 1 && hive && spire); greater_spire++) { 136 | // (greate_spire=1) => (spire=1) 137 | for(int ultra_cavern = 0; ultra_cavern == 0 || (ultra_cavern == 1 && hive); ultra_cavern++) { 138 | for(int evo = 0; evo <= 1; evo++) { 139 | for(int spore = 0; spore == 0 || (spore == 1 && evo); spore++) { // && creep_colony 140 | 141 | std::set tmp_set; 142 | tmp_set.insert((Zerg_Buildings)0); // Hatch 143 | //tmp_set.insert((Zerg_Buildings)(infestedcc*Zerg_Infested_Command_Center)); 144 | tmp_set.insert((Zerg_Buildings)(expand*Zerg_Expansion)); 145 | tmp_set.insert((Zerg_Buildings)(expand2*Zerg_Expansion2)); 146 | tmp_set.insert((Zerg_Buildings)(overlord*Zerg_Building_Overlord)); 147 | tmp_set.insert((Zerg_Buildings)(lair*Zerg_Lair)); 148 | tmp_set.insert((Zerg_Buildings)(hive*Zerg_Hive)); 149 | tmp_set.insert((Zerg_Buildings)(nydus*Zerg_Nydus_Canal)); 150 | tmp_set.insert((Zerg_Buildings)(hydraden*Zerg_Hydralisk_Den)); 151 | tmp_set.insert((Zerg_Buildings)(defiler_mound*Zerg_Defiler_Mound)); 152 | tmp_set.insert((Zerg_Buildings)(greater_spire*Zerg_Greater_Spire)); 153 | tmp_set.insert((Zerg_Buildings)(nest*Zerg_Queens_Nest)); 154 | tmp_set.insert((Zerg_Buildings)(evo*Zerg_Evolution_Chamber)); 155 | tmp_set.insert((Zerg_Buildings)(ultra_cavern*Zerg_Ultralisk_Cavern)); 156 | tmp_set.insert((Zerg_Buildings)(spire*Zerg_Spire)); 157 | tmp_set.insert((Zerg_Buildings)(pool*Zerg_Spawning_Pool)); 158 | tmp_set.insert((Zerg_Buildings)(creep_colony*Zerg_Creep_Colony)); 159 | tmp_set.insert((Zerg_Buildings)(spore*Zerg_Spore_Colony)); 160 | tmp_set.insert((Zerg_Buildings)(sunken*Zerg_Sunken_Colony)); 161 | tmp_set.insert((Zerg_Buildings)(extractor*Zerg_Extractor)); 162 | ret_vector.push_back(tmp_set); 163 | 164 | }}}}}}}}}}}}}}}}}}//} 165 | return ret_vector; 166 | } 167 | 168 | #else 169 | 170 | #include 171 | #include 172 | #include "replays.h" 173 | 174 | std::string pruneOpeningVal(std::string& input); 175 | 176 | struct tech_trees 177 | { 178 | std::vector > vector_X; // build tree (BT) as sets 179 | std::vector > set_distances_X; // distances between BT 180 | tech_trees(std::ifstream& fin) 181 | { 182 | // Fill vector_X 183 | std::set > ret_set; // unordered_set 184 | std::string line; 185 | while (getline(fin, line)) 186 | { 187 | pruneOpeningVal(line); 188 | std::multimap buildings; 189 | getBuildings(line, buildings, 0); // 0 for cutoffseconds 190 | buildings.erase(0); // key == 0 i.e. buildings not constructed 191 | std::set tmpSet; 192 | tmpSet.insert(0); // first Nexus/CC/Hatch exists 193 | for (std::multimap::const_iterator it 194 | = buildings.begin(); 195 | it != buildings.end(); ++it) 196 | { 197 | if (it->first > LEARN_TIME_LIMIT) 198 | break; 199 | tmpSet.insert(it->second.getEnumValue()); 200 | ret_set.insert(tmpSet); 201 | } 202 | } 203 | vector_X.reserve(ret_set.size()); 204 | std::copy(ret_set.begin(), ret_set.end(), 205 | std::back_inserter(vector_X)); 206 | // Fill set_distances_X 207 | for (unsigned int i = 0; i < vector_X.size(); ++i) 208 | { 209 | std::vector tmp; 210 | for (unsigned int j = 0; j < vector_X.size(); ++j) // size/2+1 211 | { 212 | tmp.push_back(set_distance(i, j)); 213 | } 214 | set_distances_X.push_back(tmp); 215 | } 216 | } 217 | int set_distance(unsigned int i, unsigned int j) 218 | { 219 | std::vector symdiff; 220 | //std::set_symmetric_difference(vector_X[i].begin(), vector_X[i].end(), 221 | // vector_X[j].begin(), vector_X[j].end(), symdiff.begin()); 222 | for (std::set::const_iterator it = vector_X[i].begin(); 223 | it != vector_X[i].end(); ++it) 224 | { 225 | if (!vector_X[j].count(*it)) 226 | symdiff.push_back(*it); 227 | } 228 | for (std::set::const_iterator jt = vector_X[j].begin(); 229 | jt != vector_X[j].end(); ++jt) 230 | { 231 | if (!vector_X[i].count(*jt)) 232 | symdiff.push_back(*jt); 233 | } 234 | return symdiff.size(); 235 | } 236 | tech_trees() {} 237 | }; 238 | 239 | #endif 240 | 241 | /// dumbest function evar 242 | /// (search in O(n) in a vector) 243 | /// TODO CHANGE 244 | int get_X_indice(const std::set& X, 245 | const std::vector >& all_X) 246 | { 247 | for (unsigned int i = 0; i < all_X.size(); ++i) 248 | { 249 | if (all_X[i] == X) 250 | return i; 251 | } 252 | std::cout << "ERROR: X not found in all existing X" << std::endl; 253 | return -1; 254 | } 255 | 256 | #endif 257 | -------------------------------------------------------------------------------- /x_values_tt.h: -------------------------------------------------------------------------------- 1 | #ifndef X_VALUES 2 | #define X_VALUES 3 | #include "parameters.h" 4 | #include 5 | #include 6 | #include 7 | #include "enums_name_tables_tt.h" 8 | 9 | /// Copyright Gabriel Synnaeve 2011 10 | /// This code is under 3-clauses (new) BSD License 11 | 12 | #ifdef GENERATE_X_VALUES 13 | 14 | #include 15 | 16 | std::vector > get_terran_X_values() 17 | { 18 | std::vector > ret_vector; 19 | 20 | for(int expand = 0; expand <= 1; expand++) { 21 | for(int supply = 0; supply <= 1; supply++) { 22 | for(int ref = 0; ref <= 1; ref++) { 23 | for(int rax = 0; rax <= 1; rax++) { 24 | for(int rax2 = 0; rax2 <= 1; rax2++) { 25 | for(int bunker = 0; bunker == 0 || (bunker <= 1 && rax); bunker++) { 26 | for(int ebay = 0; ebay == 0 || (ebay <= 1 && rax); ebay++) { 27 | for(int missile_turret = 0; missile_turret == 0 || (missile_turret <= 1 && ebay); missile_turret++) { 28 | for(int academy = 0; academy == 0 || (academy <= 1 && rax && ref); academy++) { // && supply ? 29 | for(int cs = 0 ; cs == 0 || (cs <= 1 && academy); cs++) { 30 | for(int facto = 0; facto == 0 || (facto <= 1 && rax && ref); facto++) { // && supply ? 31 | for(int armory = 0; armory == 0 || (armory <= 1 && facto); armory++) { 32 | for(int machine_shop = 0; machine_shop == 0 || (machine_shop <= 1 && facto); machine_shop++) { 33 | for(int starport = 0; starport == 0 || (starport <= 1 && facto); starport++) { 34 | for(int control_tower = 0; control_tower == 0 || (control_tower <= 1 && starport); control_tower++) { 35 | for(int science = 0; science == 0 || (science <= 1 && starport); science++) { // && facto ;) 36 | for(int covert = 0; covert == 0 || (covert <= 1 && science); covert++) { 37 | for(int ns = 0; ns == 0 || (ns <= 1 && covert); ns++) { 38 | for(int physics = 0; physics == 0 || (physics <= 1 && science); physics++) { 39 | 40 | std::set tmp_set; 41 | tmp_set.insert((Terran_Buildings)0); // CC 42 | tmp_set.insert((Terran_Buildings)(expand*Terran_Expansion)); 43 | tmp_set.insert((Terran_Buildings)(cs*Terran_Comsat_Station)); 44 | tmp_set.insert((Terran_Buildings)(ns*Terran_Nuclear_Silo)); 45 | tmp_set.insert((Terran_Buildings)(supply*Terran_Supply_Depot)); 46 | tmp_set.insert((Terran_Buildings)(ref*Terran_Refinery)); 47 | tmp_set.insert((Terran_Buildings)(rax*Terran_Barracks)); 48 | tmp_set.insert((Terran_Buildings)(rax2*Terran_Barracks2)); 49 | tmp_set.insert((Terran_Buildings)(academy*Terran_Academy)); 50 | tmp_set.insert((Terran_Buildings)(facto*Terran_Factory)); 51 | tmp_set.insert((Terran_Buildings)(starport*Terran_Starport)); 52 | tmp_set.insert((Terran_Buildings)(control_tower*Terran_Control_Tower)); 53 | tmp_set.insert((Terran_Buildings)(science*Terran_Science_Facility)); 54 | tmp_set.insert((Terran_Buildings)(covert*Terran_Covert_Ops)); 55 | tmp_set.insert((Terran_Buildings)(physics*Terran_Physics_Lab)); 56 | tmp_set.insert((Terran_Buildings)(machine_shop*Terran_Machine_Shop)); 57 | tmp_set.insert((Terran_Buildings)(ebay*Terran_Engineering_Bay)); 58 | tmp_set.insert((Terran_Buildings)(armory*Terran_Armory)); 59 | tmp_set.insert((Terran_Buildings)(missile_turret*Terran_Missile_Turret)); 60 | tmp_set.insert((Terran_Buildings)(bunker*Terran_Bunker)); 61 | ret_vector.push_back(tmp_set); 62 | 63 | }}}}}}}}}}}}}}}}}}} 64 | return ret_vector; 65 | } 66 | 67 | std::vector > get_protoss_X_values() 68 | { 69 | std::vector > ret_vector; 70 | 71 | for(int expand = 0; expand <= 1; expand++) { 72 | for(int pylon = 0; pylon <= 1; pylon++) { 73 | for(int pylon2 = 0; pylon2 <= 1; pylon2++) { 74 | for(int assim = 0; assim <= 1; assim++) { 75 | for(int gate = 0; gate == 0 || (gate == 1 && pylon); gate++) { 76 | for(int gate2 = 0; gate2 == 0 || (gate2 == 1 && pylon); gate2++) { 77 | for(int shield = 0; shield == 0 || (shield == 1 && gate); shield++) { 78 | for(int cyber = 0; cyber == 0 || (cyber == 1 && gate); cyber++) { 79 | for(int citadel = 0; citadel == 0 || (citadel == 1 && cyber && assim); citadel++) { 80 | for(int archives = 0; archives == 0 || (archives == 1 && citadel); archives++) { 81 | for(int robo = 0; robo == 0 || (robo == 1 && cyber && assim); robo++) { 82 | for(int bay = 0; bay == 0 || (bay == 1 && robo); bay++) { 83 | for(int obs = 0; obs == 0 || (obs == 1 && robo); obs++) { 84 | for(int stargate = 0; stargate == 0 || (stargate == 1 && cyber && assim); stargate++) { 85 | for(int beacon = 0; beacon == 0 || (beacon == 1 && stargate); beacon++) { 86 | for(int tribunal = 0; tribunal == 0 || (tribunal == 1 && stargate); tribunal++) { 87 | for(int forge = 0; forge <= 1; forge++) { 88 | for(int photon = 0; photon == 0 || (photon == 1 && forge); photon++) { 89 | 90 | std::set tmp_set; 91 | tmp_set.insert((Protoss_Buildings)0); // Nexus 92 | tmp_set.insert((Protoss_Buildings)(expand*Protoss_Expansion)); 93 | tmp_set.insert((Protoss_Buildings)(robo*Protoss_Robotics_Facility)); 94 | tmp_set.insert((Protoss_Buildings)(pylon*Protoss_Pylon)); 95 | tmp_set.insert((Protoss_Buildings)(pylon2*Protoss_Pylon2)); 96 | tmp_set.insert((Protoss_Buildings)(assim*Protoss_Assimilator)); 97 | tmp_set.insert((Protoss_Buildings)(obs*Protoss_Observatory)); 98 | tmp_set.insert((Protoss_Buildings)(gate*Protoss_Gateway)); 99 | tmp_set.insert((Protoss_Buildings)(gate2*Protoss_Gateway2)); 100 | tmp_set.insert((Protoss_Buildings)(photon*Protoss_Photon_Cannon)); 101 | tmp_set.insert((Protoss_Buildings)(citadel*Protoss_Citadel_of_Adun)); 102 | tmp_set.insert((Protoss_Buildings)(cyber*Protoss_Cybernetics_Core)); 103 | tmp_set.insert((Protoss_Buildings)(archives*Protoss_Templar_Archives)); 104 | tmp_set.insert((Protoss_Buildings)(forge*Protoss_Forge)); 105 | tmp_set.insert((Protoss_Buildings)(stargate*Protoss_Stargate)); 106 | tmp_set.insert((Protoss_Buildings)(beacon*Protoss_Fleet_Beacon)); 107 | tmp_set.insert((Protoss_Buildings)(tribunal*Protoss_Arbiter_Tribunal)); 108 | tmp_set.insert((Protoss_Buildings)(bay*Protoss_Robotics_Support_Bay)); 109 | tmp_set.insert((Protoss_Buildings)(shield*Protoss_Shield_Battery)); 110 | ret_vector.push_back(tmp_set); 111 | 112 | }}}}}}}}}}}}}}}}}} 113 | return ret_vector; 114 | } 115 | 116 | std::vector > get_zerg_X_values() 117 | { 118 | std::vector > ret_vector; 119 | 120 | for(int expand = 0; expand <= 1; expand++) { 121 | for(int expand2 = 0; expand2 <= 1; expand2++) { 122 | for(int overlord = 0; overlord <= 1; overlord++) { 123 | for(int extractor = 0; extractor <= 1; extractor++) { 124 | for(int creep_colony = 0; creep_colony <= 1; creep_colony++) { 125 | for(int pool = 0; pool <= 1; pool++) { 126 | for(int sunken = 0; sunken == 0 || (sunken == 1 && pool); sunken++) { // && creep_colony 127 | for(int hydraden = 0; hydraden == 0 || (hydraden == 1 && pool && extractor); hydraden++) { 128 | for(int lair = 0; lair == 0 || (lair == 1 && pool && extractor); lair++) { 129 | for(int spire = 0; spire == 0 || (spire == 1 && lair); spire++) { 130 | for(int nest = 0; nest == 0 || (nest == 1 && lair); nest++) { 131 | //for(int infestedcc = 0; infestedcc == 0 || (infestedcc == 1 && nest); infestedcc++) { 132 | for(int hive = 0; hive == 0 || (hive == 1 && nest); hive++) { 133 | for(int nydus = 0; nydus == 0 || (nydus == 1 && hive); nydus++) { 134 | for(int defiler_mound = 0; defiler_mound == 0 || (defiler_mound == 1 && hive); defiler_mound++) { 135 | for(int greater_spire = 0; greater_spire == 0 || (greater_spire == 1 && hive && spire); greater_spire++) { 136 | // (greate_spire=1) => (spire=1) 137 | for(int ultra_cavern = 0; ultra_cavern == 0 || (ultra_cavern == 1 && hive); ultra_cavern++) { 138 | for(int evo = 0; evo <= 1; evo++) { 139 | for(int spore = 0; spore == 0 || (spore == 1 && evo); spore++) { // && creep_colony 140 | 141 | std::set tmp_set; 142 | tmp_set.insert((Zerg_Buildings)0); // Hatch 143 | //tmp_set.insert((Zerg_Buildings)(infestedcc*Zerg_Infested_Command_Center)); 144 | tmp_set.insert((Zerg_Buildings)(expand*Zerg_Expansion)); 145 | tmp_set.insert((Zerg_Buildings)(expand2*Zerg_Expansion2)); 146 | tmp_set.insert((Zerg_Buildings)(overlord*Zerg_Building_Overlord)); 147 | tmp_set.insert((Zerg_Buildings)(lair*Zerg_Lair)); 148 | tmp_set.insert((Zerg_Buildings)(hive*Zerg_Hive)); 149 | tmp_set.insert((Zerg_Buildings)(nydus*Zerg_Nydus_Canal)); 150 | tmp_set.insert((Zerg_Buildings)(hydraden*Zerg_Hydralisk_Den)); 151 | tmp_set.insert((Zerg_Buildings)(defiler_mound*Zerg_Defiler_Mound)); 152 | tmp_set.insert((Zerg_Buildings)(greater_spire*Zerg_Greater_Spire)); 153 | tmp_set.insert((Zerg_Buildings)(nest*Zerg_Queens_Nest)); 154 | tmp_set.insert((Zerg_Buildings)(evo*Zerg_Evolution_Chamber)); 155 | tmp_set.insert((Zerg_Buildings)(ultra_cavern*Zerg_Ultralisk_Cavern)); 156 | tmp_set.insert((Zerg_Buildings)(spire*Zerg_Spire)); 157 | tmp_set.insert((Zerg_Buildings)(pool*Zerg_Spawning_Pool)); 158 | tmp_set.insert((Zerg_Buildings)(creep_colony*Zerg_Creep_Colony)); 159 | tmp_set.insert((Zerg_Buildings)(spore*Zerg_Spore_Colony)); 160 | tmp_set.insert((Zerg_Buildings)(sunken*Zerg_Sunken_Colony)); 161 | tmp_set.insert((Zerg_Buildings)(extractor*Zerg_Extractor)); 162 | ret_vector.push_back(tmp_set); 163 | 164 | }}}}}}}}}}}}}}}}}}//} 165 | return ret_vector; 166 | } 167 | 168 | #else 169 | 170 | #include 171 | #include 172 | #include "replays.h" 173 | 174 | struct tech_trees 175 | { 176 | std::vector > vector_X; // build tree (BT) as sets 177 | std::vector vector_X_trees; // BT as trees (root node) 178 | std::vector > distances_X; // distances between BT 179 | tech_trees(std::ifstream& fin) 180 | { 181 | std::set > ret_set; // unordered_set 182 | std::string line; 183 | while (getline(fin, line)) 184 | { 185 | std::multimap buildings; 186 | getBuildings(line, buildings, 0); // 0 for cutoffseconds 187 | buildings.erase(0); // key == 0 i.e. buildings not constructed 188 | std::set tmpSet; 189 | tmpSet.insert(0); // first Nexus/CC/Hatch exists 190 | for (std::multimap::const_iterator it 191 | = buildings.begin(); 192 | it != buildings.end(); ++it) 193 | { 194 | if (it->first > LEARN_TIME_LIMIT) 195 | break; 196 | tmpSet.insert(it->second.getEnumValue()); 197 | ret_set.insert(tmpSet); 198 | } 199 | } 200 | vector_X.reserve(ret_set.size()); 201 | std::copy(ret_set.begin(), ret_set.end(), 202 | std::back_inserter(vector_X)); 203 | } 204 | tech_trees() {} 205 | }; 206 | 207 | #endif 208 | 209 | /// dumbest function evar 210 | /// (search in O(n) in a vector) 211 | /// TODO CHANGE 212 | int get_X_indice(const std::set& X, 213 | const std::vector >& all_X) 214 | { 215 | for (unsigned int i = 0; i < all_X.size(); ++i) 216 | { 217 | if (all_X[i] == X) 218 | return i; 219 | } 220 | std::cout << "ERROR: X not found in all existing X" << std::endl; 221 | return -1; 222 | } 223 | 224 | #endif 225 | --------------------------------------------------------------------------------