v3 working?
parent
f1371a72b4
commit
b09658f03f
Binary file not shown.
|
@ -402,3 +402,34 @@
|
|||
4 1716 1689809894936926601 CMakeFiles/parksnrec.dir/src/genetic/v3/program_v3.cpp.o 7203e7cb37c07468
|
||||
5 1749 1689809894970260831 CMakeFiles/parksnrec.dir/src/parks/renderer/engine.cpp.o 875432a17ebda434
|
||||
1749 1905 1689809895123598284 parksnrec fc63db74fd58366e
|
||||
4 1753 1689813146683375615 CMakeFiles/parksnrec.dir/src/genetic/v3/program_v3.cpp.o 7203e7cb37c07468
|
||||
4 1817 1689813146746709121 CMakeFiles/parksnrec.dir/src/parks/renderer/engine.cpp.o 875432a17ebda434
|
||||
1817 1992 1689813146920042927 parksnrec fc63db74fd58366e
|
||||
4 1288 1689813271026895716 CMakeFiles/parksnrec.dir/src/genetic/v3/functions_v3.cpp.o 2851fa30bacfc7d5
|
||||
1289 1444 1689813271180229106 parksnrec fc63db74fd58366e
|
||||
4 1456 1689813577963029145 CMakeFiles/parksnrec.dir/src/genetic/v3/functions_v3.cpp.o 2851fa30bacfc7d5
|
||||
4 1809 1689813578316361251 CMakeFiles/parksnrec.dir/src/genetic/v3/program_v3.cpp.o 7203e7cb37c07468
|
||||
5 1900 1689813578406360938 CMakeFiles/parksnrec.dir/src/parks/renderer/engine.cpp.o 875432a17ebda434
|
||||
1900 2081 1689813578586360314 parksnrec fc63db74fd58366e
|
||||
4 1451 1689813754448956246 CMakeFiles/parksnrec.dir/src/genetic/v3/functions_v3.cpp.o 2851fa30bacfc7d5
|
||||
4 1820 1689813754815621140 CMakeFiles/parksnrec.dir/src/genetic/v3/program_v3.cpp.o 7203e7cb37c07468
|
||||
4 1872 1689813754868954216 CMakeFiles/parksnrec.dir/src/parks/renderer/engine.cpp.o 875432a17ebda434
|
||||
1872 2028 1689813755022286808 parksnrec fc63db74fd58366e
|
||||
4 1724 1689813866795041840 CMakeFiles/parksnrec.dir/src/genetic/v3/program_v3.cpp.o 7203e7cb37c07468
|
||||
4 1836 1689813866908374552 CMakeFiles/parksnrec.dir/src/parks/renderer/engine.cpp.o 875432a17ebda434
|
||||
1836 1996 1689813867065040358 parksnrec fc63db74fd58366e
|
||||
5 1290 1689813935121321989 CMakeFiles/parksnrec.dir/src/genetic/v3/functions_v3.cpp.o 2851fa30bacfc7d5
|
||||
1290 1453 1689813935281321057 parksnrec fc63db74fd58366e
|
||||
4 1461 1689814929357575706 CMakeFiles/parksnrec.dir/src/genetic/v3/functions_v3.cpp.o 2851fa30bacfc7d5
|
||||
4 1774 1689814929670906592 CMakeFiles/parksnrec.dir/src/genetic/v3/program_v3.cpp.o 7203e7cb37c07468
|
||||
4 1888 1689814929787572347 CMakeFiles/parksnrec.dir/src/parks/renderer/engine.cpp.o 875432a17ebda434
|
||||
1889 2047 1689814929944237789 parksnrec fc63db74fd58366e
|
||||
4 1737 1689814943447465555 CMakeFiles/parksnrec.dir/src/genetic/v3/program_v3.cpp.o 7203e7cb37c07468
|
||||
5 1804 1689814943514131701 CMakeFiles/parksnrec.dir/src/parks/renderer/engine.cpp.o 875432a17ebda434
|
||||
1804 1966 1689814943674130449 parksnrec fc63db74fd58366e
|
||||
4 1626 1689815043493346674 CMakeFiles/parksnrec.dir/src/genetic/v3/program_v3.cpp.o 7203e7cb37c07468
|
||||
1626 1784 1689815043650012107 parksnrec fc63db74fd58366e
|
||||
4 1637 1689815127412683671 CMakeFiles/parksnrec.dir/src/genetic/v3/program_v3.cpp.o 7203e7cb37c07468
|
||||
1637 1793 1689815127566015790 parksnrec fc63db74fd58366e
|
||||
4 1712 1689815769560520877 CMakeFiles/parksnrec.dir/src/genetic/v3/program_v3.cpp.o 7203e7cb37c07468
|
||||
1713 1866 1689815769710517695 parksnrec fc63db74fd58366e
|
||||
|
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1,3 +1,3 @@
|
|||
Start testing: Jul 19 19:38 EDT
|
||||
Start testing: Jul 19 21:16 EDT
|
||||
----------------------------------------------------------
|
||||
End testing: Jul 19 19:38 EDT
|
||||
End testing: Jul 19 21:16 EDT
|
||||
|
|
|
@ -21,5 +21,5 @@ Collapsed=0
|
|||
[Window][ImNodes]
|
||||
Pos=269,23
|
||||
Size=1157,957
|
||||
Collapsed=0
|
||||
Collapsed=1
|
||||
|
||||
|
|
Binary file not shown.
|
@ -26,6 +26,8 @@ namespace parks::genetic {
|
|||
constexpr unsigned char ARGS_FUNCS = 0b00100000;
|
||||
|
||||
|
||||
Color randScalar(OperatorArguments args, const ParameterSet& params);
|
||||
Color randColor(OperatorArguments args, const ParameterSet& params);
|
||||
Color add(OperatorArguments args, const ParameterSet& params);
|
||||
Color subtract(OperatorArguments args, const ParameterSet& params);
|
||||
Color multiply(OperatorArguments args, const ParameterSet& params);
|
||||
|
@ -43,7 +45,7 @@ namespace parks::genetic {
|
|||
Color colorNoise(OperatorArguments args, const ParameterSet& params);
|
||||
|
||||
enum class FunctionID {
|
||||
ADD, SUBTRACT, MULTIPLY, DIVIDE, MOD, ROUND, MIN, MAX, ABS, LOG, SIN, COS, ATAN, NOISE, COLOR_NOISE
|
||||
RAND_SCALAR, RAND_COLOR, ADD, SUBTRACT, MULTIPLY, DIVIDE, MOD, ROUND, MIN, MAX, ABS, LOG, SIN, COS, ATAN, NOISE, COLOR_NOISE
|
||||
};
|
||||
|
||||
class Function {
|
||||
|
@ -136,6 +138,8 @@ namespace parks::genetic {
|
|||
};
|
||||
|
||||
inline FunctionStorage functions = {
|
||||
{FunctionID::RAND_SCALAR, new Function{"RS", parks::genetic::randScalar, 1, 0, ARGS_NONE}},
|
||||
{FunctionID::RAND_COLOR, new Function{"RC", parks::genetic::randColor, 0, 1, ARGS_NONE}},
|
||||
{FunctionID::ADD, new Function{"+", parks::genetic::add, 0, 0, ARGS_BOTH | ARGS_SCALARS | ARGS_COLORS | ARGS_VARIABLES | ARGS_FUNCS}},
|
||||
{FunctionID::SUBTRACT, new Function{"-", parks::genetic::subtract, 0, 0, ARGS_BOTH | ARGS_SCALARS | ARGS_COLORS | ARGS_VARIABLES | ARGS_FUNCS}},
|
||||
{FunctionID::MULTIPLY, new Function{"*", parks::genetic::multiply, 0, 0, ARGS_BOTH | ARGS_SCALARS | ARGS_COLORS | ARGS_VARIABLES | ARGS_FUNCS}},
|
||||
|
|
|
@ -35,17 +35,19 @@ namespace parks::genetic {
|
|||
for (int i = 0; i < size; i++)
|
||||
nodes[i] = nullptr;
|
||||
|
||||
//nodes[0] = new GeneticNode(FunctionID::ADD, 0, functions[FunctionID::ADD].generateRandomParameters());
|
||||
|
||||
generateRandomTree();
|
||||
}
|
||||
|
||||
Color execute(double x, double y);
|
||||
|
||||
static inline int left(int pos){
|
||||
return 2 * pos;
|
||||
return 2 * (pos + 1);
|
||||
}
|
||||
|
||||
static inline int right(int pos){
|
||||
return 2 * pos + 1;
|
||||
return 2 * (pos + 1) + 1;
|
||||
}
|
||||
|
||||
static inline int parent(int pos){
|
||||
|
|
|
@ -16,7 +16,7 @@ namespace parks::genetic {
|
|||
}
|
||||
|
||||
Color subtract(OperatorArguments args, const ParameterSet& params) {
|
||||
return applyFunc(std::minus(), args.left, args.right);
|
||||
return applyFunc(std::minus(), args.left, args.right);;
|
||||
}
|
||||
|
||||
Color multiply(OperatorArguments args, const ParameterSet& params) {
|
||||
|
@ -86,6 +86,14 @@ namespace parks::genetic {
|
|||
return Color(r, g, b);
|
||||
}
|
||||
|
||||
Color randScalar(OperatorArguments args, const ParameterSet& params) {
|
||||
return params[0];
|
||||
}
|
||||
|
||||
Color randColor(OperatorArguments args, const ParameterSet& params) {
|
||||
return params[0];
|
||||
}
|
||||
|
||||
FunctionStorage::FunctionStorage(
|
||||
std::initializer_list<std::pair<FunctionID, Function*>>&& init
|
||||
) {
|
||||
|
|
|
@ -117,6 +117,7 @@ namespace parks::genetic {
|
|||
|
||||
void GeneticTree::generateRandomTree() {
|
||||
std::queue<int> nodesToProcess;
|
||||
std::queue<int> nonFuncNodesToProcess;
|
||||
nodesToProcess.push(0);
|
||||
while (!nodesToProcess.empty()){
|
||||
int node = nodesToProcess.front();
|
||||
|
@ -125,31 +126,56 @@ namespace parks::genetic {
|
|||
if (node >= size)
|
||||
continue;
|
||||
|
||||
// // end early by constructing a leaf
|
||||
// if (chance(5)){
|
||||
// continue;
|
||||
// }
|
||||
|
||||
auto op = functions.select();
|
||||
auto& func = functions[op];
|
||||
ParameterSet set = func.generateRandomParameters();
|
||||
|
||||
if (func.allowsArgument() && func.allowedFuncs()) {
|
||||
if (func.allowsArgument()) {
|
||||
auto& queueToAddTo = func.allowedFuncs() ? nodesToProcess : nonFuncNodesToProcess;
|
||||
if (func.singleArgument())
|
||||
nodesToProcess.push(left(node));
|
||||
queueToAddTo.push(left(node));
|
||||
else if (func.bothArgument()){
|
||||
nodesToProcess.push(left(node));
|
||||
nodesToProcess.push(right(node));
|
||||
queueToAddTo.push(left(node));
|
||||
queueToAddTo.push(right(node));
|
||||
} else if (func.dontCareArgument()) {
|
||||
if (chance(80))
|
||||
nodesToProcess.push(left(node));
|
||||
queueToAddTo.push(left(node));
|
||||
if (chance(80))
|
||||
nodesToProcess.push(right(node));
|
||||
queueToAddTo.push(right(node));
|
||||
}
|
||||
}
|
||||
|
||||
nodes[node] = new GeneticNode(op, node, set);
|
||||
}
|
||||
|
||||
while (!nonFuncNodesToProcess.empty()){
|
||||
int node = nonFuncNodesToProcess.front();
|
||||
nonFuncNodesToProcess.pop();
|
||||
|
||||
if (node >= size)
|
||||
continue;
|
||||
|
||||
int parent = GeneticTree::parent(node);
|
||||
auto parentNode = this->node(parent);
|
||||
|
||||
// TODO: throw error?!?
|
||||
if (parentNode == nullptr)
|
||||
continue;
|
||||
|
||||
auto& parentFunc = functions[parentNode->op];
|
||||
|
||||
std::vector<FunctionID> allowedFuncs;
|
||||
if (parentFunc.allowedColors())
|
||||
allowedFuncs.push_back(FunctionID::RAND_COLOR);
|
||||
if (parentFunc.allowedScalars())
|
||||
allowedFuncs.push_back(FunctionID::RAND_SCALAR);
|
||||
|
||||
if (allowedFuncs.empty())
|
||||
continue;
|
||||
|
||||
auto func = allowedFuncs[randomInt(0, (int)allowedFuncs.size()-1)];
|
||||
nodes[node] = new GeneticNode(func, node, functions[func].generateRandomParameters());
|
||||
}
|
||||
}
|
||||
|
||||
int GeneticTree::height(int node) {
|
||||
|
@ -170,6 +196,9 @@ namespace parks::genetic {
|
|||
auto ourNode = nodes[node];
|
||||
auto& func = functions[ourNode->op];
|
||||
|
||||
if (func.disallowsArgument())
|
||||
return func.call({ARGS_NONE, leftC, rightC}, ourNode->set);
|
||||
|
||||
// functions should always take precedence
|
||||
if (func.allowedFuncs()) {
|
||||
int l = left(node);
|
||||
|
@ -180,27 +209,23 @@ namespace parks::genetic {
|
|||
|
||||
if (lNode != nullptr)
|
||||
leftC = execute_internal(x, y, l);
|
||||
else
|
||||
if (func.allowedVariables())
|
||||
leftC = Color(x);
|
||||
if (rNode != nullptr)
|
||||
rightC = execute_internal(x, y, r);
|
||||
else
|
||||
if (func.allowedVariables())
|
||||
rightC = Color(y);
|
||||
} else {
|
||||
std::vector<Color> lefts;
|
||||
std::vector<Color> rights;
|
||||
if (func.allowedColors()) {
|
||||
lefts.push_back(RandomColor::get());
|
||||
rights.push_back(RandomColor::get());
|
||||
}
|
||||
if (func.allowedScalars()) {
|
||||
lefts.push_back(RandomScalar::get());
|
||||
rights.push_back(RandomScalar::get());
|
||||
}
|
||||
if (func.allowedVariables()) {
|
||||
lefts.emplace_back(x);
|
||||
rights.emplace_back(y);
|
||||
leftC = Color(x);
|
||||
rightC = Color(y);
|
||||
} else {
|
||||
BLT_WARN("Function called (%s) from node (%d) without any args!", func.name.c_str(), node);
|
||||
}
|
||||
leftC = lefts[randomInt(0, (int)lefts.size()-1)];
|
||||
rightC = rights[randomInt(0, (int)rights.size()-1)];
|
||||
}
|
||||
return func.call({ARGS_SINGLE, leftC, rightC}, ourNode->set);
|
||||
return func.call({ARGS_BOTH, leftC, rightC}, ourNode->set);
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue