|
@@ -6,7 +6,7 @@ namespace mdd {
|
|
|
ModuleMath::ModuleMath(MathOperation operation) {
|
|
|
_operation = operation;
|
|
|
json default_val;
|
|
|
- default_val["value"] = 1;
|
|
|
+ default_val["value"] = { 1 };
|
|
|
addInput("Value", default_val);
|
|
|
addInput("Value", default_val);
|
|
|
addOutput("Value", default_val);
|
|
@@ -14,12 +14,19 @@ namespace mdd {
|
|
|
}
|
|
|
|
|
|
json ModuleMath::add(const json &val1, const json &val2) {
|
|
|
- json ret = json::array();
|
|
|
+ json ret; //= json::array();
|
|
|
if (val1.is_array()) {
|
|
|
- for (int i = 0; i < val1.size(); i++) {
|
|
|
+ size_t size = std::max(val1.size(), val2.size());
|
|
|
+ for (int i = 0; i < size; i++) {
|
|
|
if (val2.is_array()) {
|
|
|
if (val1.size() == val2.size()) {
|
|
|
- ret.push_back(add(val1[i],val2[i]));
|
|
|
+ ret.push_back(add(val1[i], val2[i]));
|
|
|
+ }
|
|
|
+ else if (1 == val1.size()) {
|
|
|
+ ret.push_back(add(val1[1], val2[i]));
|
|
|
+ }
|
|
|
+ else if (1 == val2.size()) {
|
|
|
+ ret.push_back(add(val1[i], val2[1]));
|
|
|
}
|
|
|
} else {
|
|
|
ret.push_back(add(val1[i],val2));
|
|
@@ -59,11 +66,18 @@ namespace mdd {
|
|
|
json ModuleMath::subtract(const json &val1, const json &val2){
|
|
|
json ret = json::array();
|
|
|
if (val1.is_array()) {
|
|
|
- for (int i = 0; i < val1.size(); i++) {
|
|
|
+ size_t size = std::max(val1.size(), val2.size());
|
|
|
+ for (int i = 0; i < size; i++) {
|
|
|
if (val2.is_array()) {
|
|
|
if (val1.size() == val2.size()) {
|
|
|
ret.push_back(subtract(val1[i],val2[i]));
|
|
|
}
|
|
|
+ else if (1 == val1.size()) {
|
|
|
+ ret.push_back(subtract(val1[1], val2[i]));
|
|
|
+ }
|
|
|
+ else if (1 == val2.size()) {
|
|
|
+ ret.push_back(subtract(val1[i], val2[1]));
|
|
|
+ }
|
|
|
} else {
|
|
|
ret.push_back(subtract(val1[i],val2));
|
|
|
}
|
|
@@ -102,10 +116,17 @@ namespace mdd {
|
|
|
json ModuleMath::multiply(const json &val1, const json &val2){
|
|
|
json ret = json::array();
|
|
|
if (val1.is_array()) {
|
|
|
- for (int i = 0; i < val1.size(); i++) {
|
|
|
+ size_t size = std::max(val1.size(), val2.size());
|
|
|
+ for (int i = 0; i < size; i++) {
|
|
|
if (val2.is_array()) {
|
|
|
if (val1.size() == val2.size()) {
|
|
|
- ret.push_back(multiply(val1[i],val2[i]));
|
|
|
+ ret.push_back(multiply(val1[i], val2[i]));
|
|
|
+ }
|
|
|
+ else if (1 == val1.size()) {
|
|
|
+ ret.push_back(multiply(val1[1], val2[i]));
|
|
|
+ }
|
|
|
+ else if (1 == val2.size()) {
|
|
|
+ ret.push_back(multiply(val1[i], val2[1]));
|
|
|
}
|
|
|
} else {
|
|
|
ret.push_back(multiply(val1[i],val2));
|
|
@@ -145,10 +166,17 @@ namespace mdd {
|
|
|
json ModuleMath::divide(const json &val1, const json &val2){
|
|
|
json ret = json::array();
|
|
|
if (val1.is_array()) {
|
|
|
- for (int i = 0; i < val1.size(); i++) {
|
|
|
+ size_t size = std::max(val1.size(), val2.size());
|
|
|
+ for (int i = 0; i < size; i++) {
|
|
|
if (val2.is_array()) {
|
|
|
if (val1.size() == val2.size()) {
|
|
|
- ret.push_back(divide(val1[i],val2[i]));
|
|
|
+ ret.push_back(divide(val1[i], val2[i]));
|
|
|
+ }
|
|
|
+ else if (1 == val1.size()) {
|
|
|
+ ret.push_back(divide(val1[1], val2[i]));
|
|
|
+ }
|
|
|
+ else if (1 == val2.size()) {
|
|
|
+ ret.push_back(divide(val1[i], val2[1]));
|
|
|
}
|
|
|
} else {
|
|
|
ret.push_back(divide(val1[i],val2));
|
|
@@ -188,11 +216,18 @@ namespace mdd {
|
|
|
json ModuleMath::power(const json &val1, const json &val2){
|
|
|
json ret = json::array();
|
|
|
if (val1.is_array()) {
|
|
|
- for (int i = 0; i < val1.size(); i++) {
|
|
|
+ size_t size = std::max(val1.size(), val2.size());
|
|
|
+ for (int i = 0; i < size; i++) {
|
|
|
if (val2.is_array()) {
|
|
|
if (val1.size() == val2.size()) {
|
|
|
ret.push_back(power(val1[i], val2[i]));
|
|
|
}
|
|
|
+ else if (1 == val1.size()) {
|
|
|
+ ret.push_back(power(val1[1], val2[i]));
|
|
|
+ }
|
|
|
+ else if (1 == val2.size()) {
|
|
|
+ ret.push_back(power(val1[i], val2[1]));
|
|
|
+ }
|
|
|
}
|
|
|
else {
|
|
|
ret.push_back(power(val1[i], val2));
|
|
@@ -238,11 +273,18 @@ namespace mdd {
|
|
|
json ModuleMath::logarithm(const json &val1, const json &val2){
|
|
|
json ret = json::array();
|
|
|
if (val1.is_array()) {
|
|
|
- for (int i = 0; i < val1.size(); i++) {
|
|
|
+ size_t size = std::max(val1.size(), val2.size());
|
|
|
+ for (int i = 0; i < size; i++) {
|
|
|
if (val2.is_array()) {
|
|
|
if (val1.size() == val2.size()) {
|
|
|
ret.push_back(logarithm(val1[i], val2[i]));
|
|
|
}
|
|
|
+ else if (1 == val1.size()) {
|
|
|
+ ret.push_back(logarithm(val1[1], val2[i]));
|
|
|
+ }
|
|
|
+ else if (1 == val2.size()) {
|
|
|
+ ret.push_back(logarithm(val1[i], val2[1]));
|
|
|
+ }
|
|
|
}
|
|
|
else {
|
|
|
ret.push_back(logarithm(val1[i], val2));
|
|
@@ -288,10 +330,17 @@ namespace mdd {
|
|
|
json ModuleMath::minimum(const json &val1, const json &val2){
|
|
|
json ret = json::array();
|
|
|
if (val1.is_array()) {
|
|
|
- for (int i = 0; i < val1.size(); i++) {
|
|
|
+ size_t size = std::max(val1.size(), val2.size());
|
|
|
+ for (int i = 0; i < size; i++) {
|
|
|
if (val2.is_array()) {
|
|
|
if (val1.size() == val2.size()) {
|
|
|
- ret.push_back(minimum(val1[i],val2[i]));
|
|
|
+ ret.push_back(minimum(val1[i], val2[i]));
|
|
|
+ }
|
|
|
+ else if (1 == val1.size()) {
|
|
|
+ ret.push_back(minimum(val1[1], val2[i]));
|
|
|
+ }
|
|
|
+ else if (1 == val2.size()) {
|
|
|
+ ret.push_back(minimum(val1[i], val2[1]));
|
|
|
}
|
|
|
} else {
|
|
|
ret.push_back(minimum(val1[i],val2));
|
|
@@ -347,20 +396,27 @@ namespace mdd {
|
|
|
json ModuleMath::maximum(const json &val1, const json &val2){
|
|
|
json ret = json::array();
|
|
|
if (val1.is_array()) {
|
|
|
- for (int i = 0; i < val1.size(); i++) {
|
|
|
+ size_t size = std::max(val1.size(), val2.size());
|
|
|
+ for (int i = 0; i < size; i++) {
|
|
|
if (val2.is_array()) {
|
|
|
if (val1.size() == val2.size()) {
|
|
|
- ret.push_back(minimum(val1[i],val2[i]));
|
|
|
+ ret.push_back(maximum(val1[i], val2[i]));
|
|
|
+ }
|
|
|
+ else if (1 == val1.size()) {
|
|
|
+ ret.push_back(maximum(val1[1], val2[i]));
|
|
|
+ }
|
|
|
+ else if (1 == val2.size()) {
|
|
|
+ ret.push_back(maximum(val1[i], val2[1]));
|
|
|
}
|
|
|
} else {
|
|
|
- ret.push_back(minimum(val1[i],val2));
|
|
|
+ ret.push_back(maximum(val1[i],val2));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
if (val2.is_array()) {
|
|
|
for (int i = 0; i < val2.size(); i++) {
|
|
|
- ret.push_back(minimum(val1,val2[i]));
|
|
|
+ ret.push_back(maximum(val1,val2[i]));
|
|
|
}
|
|
|
} else {
|
|
|
if (val1.is_number() && val2.is_number()) {
|
|
@@ -406,11 +462,18 @@ namespace mdd {
|
|
|
json ModuleMath::less(const json &val1, const json &val2){
|
|
|
json ret = json::array();
|
|
|
if (val1.is_array()) {
|
|
|
- for (int i = 0; i < val1.size(); i++) {
|
|
|
+ size_t size = std::max(val1.size(), val2.size());
|
|
|
+ for (int i = 0; i < size; i++) {
|
|
|
if (val2.is_array()) {
|
|
|
if (val1.size() == val2.size()) {
|
|
|
ret.push_back(less(val1[i], val2[i]));
|
|
|
}
|
|
|
+ else if (1 == val1.size()) {
|
|
|
+ ret.push_back(less(val1[1], val2[i]));
|
|
|
+ }
|
|
|
+ if (1 == val2.size()) {
|
|
|
+ ret.push_back(less(val1[i], val2[1]));
|
|
|
+ }
|
|
|
}
|
|
|
else {
|
|
|
ret.push_back(less(val1[i], val2));
|
|
@@ -476,11 +539,18 @@ namespace mdd {
|
|
|
json ModuleMath::greater(const json &val1, const json &val2){
|
|
|
json ret = json::array();
|
|
|
if (val1.is_array()) {
|
|
|
- for (int i = 0; i < val1.size(); i++) {
|
|
|
+ size_t size = std::max(val1.size(), val2.size());
|
|
|
+ for (int i = 0; i < size; i++) {
|
|
|
if (val2.is_array()) {
|
|
|
if (val1.size() == val2.size()) {
|
|
|
ret.push_back(greater(val1[i], val2[i]));
|
|
|
}
|
|
|
+ else if (1 == val1.size()) {
|
|
|
+ ret.push_back(greater(val1[1], val2[i]));
|
|
|
+ }
|
|
|
+ else if (1 == val2.size()) {
|
|
|
+ ret.push_back(greater(val1[i], val2[1]));
|
|
|
+ }
|
|
|
}
|
|
|
else {
|
|
|
ret.push_back(greater(val1[i], val2));
|
|
@@ -543,58 +613,55 @@ namespace mdd {
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
- bool ModuleMath::update() {
|
|
|
+ state ModuleMath::update() {
|
|
|
json ret = getOutput(0)->getValue()["value"];
|
|
|
|
|
|
switch (_operation) {
|
|
|
- case ADD:
|
|
|
+ case MathOperation::ADD:
|
|
|
ret = add(getInput(0)->getValue()["value"], getInput(1)->getValue()["value"]);
|
|
|
break;
|
|
|
|
|
|
- case SUBTRACT:
|
|
|
+ case MathOperation::SUBTRACT:
|
|
|
ret = subtract(getInput(0)->getValue()["value"], getInput(1)->getValue()["value"]);
|
|
|
break;
|
|
|
|
|
|
- case MULTIPLY:
|
|
|
+ case MathOperation::MULTIPLY:
|
|
|
ret = multiply(getInput(0)->getValue()["value"], getInput(1)->getValue()["value"]);
|
|
|
break;
|
|
|
|
|
|
- case DIVIDE:
|
|
|
+ case MathOperation::DIVIDE:
|
|
|
ret = divide(getInput(0)->getValue()["value"], getInput(1)->getValue()["value"]);
|
|
|
break;
|
|
|
|
|
|
- case POWER:
|
|
|
+ case MathOperation::POWER:
|
|
|
ret = power(getInput(0)->getValue()["value"], getInput(1)->getValue()["value"]);
|
|
|
break;
|
|
|
|
|
|
- case LOGARITHM:
|
|
|
+ case MathOperation::LOGARITHM:
|
|
|
ret = logarithm(getInput(0)->getValue()["value"], getInput(1)->getValue()["value"]);
|
|
|
break;
|
|
|
|
|
|
- case MINIMUM:
|
|
|
+ case MathOperation::MINIMUM:
|
|
|
ret = minimum(getInput(0)->getValue()["value"], getInput(1)->getValue()["value"]);
|
|
|
break;
|
|
|
|
|
|
- case MAXIMUM:
|
|
|
+ case MathOperation::MAXIMUM:
|
|
|
ret = maximum(getInput(0)->getValue()["value"], getInput(1)->getValue()["value"]);
|
|
|
break;
|
|
|
|
|
|
- case LESS_THAN:
|
|
|
+ case MathOperation::LESS_THAN:
|
|
|
ret = less(getInput(0)->getValue()["value"], getInput(1)->getValue()["value"]);
|
|
|
break;
|
|
|
|
|
|
- case GREATER_THAN:
|
|
|
+ case MathOperation::GREATER_THAN:
|
|
|
ret = greater(getInput(0)->getValue()["value"], getInput(1)->getValue()["value"]);
|
|
|
break;
|
|
|
}
|
|
|
-
|
|
|
+ getOutput(0)->resetState();
|
|
|
if (ret.dump() != getOutput(0)->getValue()["value"].dump()) {
|
|
|
getOutput(0)->getValueInternal()["value"] = ret ;
|
|
|
- return true;
|
|
|
- }
|
|
|
- else{
|
|
|
- return false;
|
|
|
}
|
|
|
+ return getOutput(0)->getState();
|
|
|
}
|
|
|
|
|
|
|