Skip to content

Commit 6e63527

Browse files
committed
finished derivatives + fixed division bugs for the release
1 parent 2d83114 commit 6e63527

19 files changed

+101
-84
lines changed

src/main/java/net/akami/mask/operation/Sum.java src/main/java/net/akami/mask/operation/Adder.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,18 @@
1010
import java.util.List;
1111
import java.util.Map;
1212

13-
public class Sum extends BinaryOperationHandler {
13+
public class Adder extends BinaryOperationHandler {
1414

15-
private static final Sum INSTANCE = new Sum();
15+
private static final Adder INSTANCE = new Adder();
1616

1717
@Override
1818
public String operate(String a, String b) {
19-
LOGGER.info("Sum process of {} |+| {}: \n", a, b);
19+
LOGGER.info("Adder process of {} |+| {}: \n", a, b);
2020
List<String> monomials = ExpressionUtils.toMonomials(a);
2121
monomials.addAll(ExpressionUtils.toMonomials(b));
2222
LOGGER.info("Monomials : {}", monomials);
2323
String result = monomialSum(monomials, false);
24-
LOGGER.info("---> Sum result of {} |+| {}: {}", a, b, result);
24+
LOGGER.info("---> Adder result of {} |+| {}: {}", a, b, result);
2525
return result;
2626
}
2727

@@ -147,7 +147,7 @@ public String outFormat(String origin) {
147147
return FormatterFactory.removeMultiplicationSigns(origin);
148148
}
149149

150-
public static Sum getInstance() {
150+
public static Adder getInstance() {
151151
return INSTANCE;
152152
}
153153
}

src/main/java/net/akami/mask/operation/Derivative.java src/main/java/net/akami/mask/operation/Differentiator.java

+6-5
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@
1313
/**
1414
* Does not work yet
1515
*/
16-
public class Derivative {
16+
public class Differentiator {
1717

18-
private static final Derivative INSTANCE = new Derivative();
18+
private static final Differentiator INSTANCE = new Differentiator();
1919
private static final QuaternaryOperationSign[] PROCEDURAL_OPERATIONS;
20-
private static final Logger LOGGER = LoggerFactory.getLogger(Derivative.class);
20+
private static final Logger LOGGER = LoggerFactory.getLogger(Differentiator.class);
2121

2222
static {
2323
PROCEDURAL_OPERATIONS = new QuaternaryOperationSign[]{
@@ -84,10 +84,11 @@ public static String differentiateElement(String element) {
8484
if(element.length() == 1)
8585
return "1";
8686

87-
return MathUtils.diffPow(String.valueOf(element.charAt(0)), null, element.substring(2), null);
87+
String[] parts = element.split("\\^", 2);
88+
return MathUtils.diffPow(parts[0], differentiateElement(parts[0]), parts[1], null);
8889
}
8990

90-
public static Derivative getInstance() {
91+
public static Differentiator getInstance() {
9192
return INSTANCE;
9293
}
9394
}

src/main/java/net/akami/mask/operation/Division.java src/main/java/net/akami/mask/operation/Divider.java

+13-7
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,29 @@
88
import java.math.MathContext;
99
import java.util.List;
1010

11-
public class Division extends BinaryOperationHandler {
11+
public class Divider extends BinaryOperationHandler {
1212

13-
private static final Division INSTANCE = new Division();
13+
private static final Divider INSTANCE = new Divider();
1414
private static final MathContext CONTEXT = new MathContext(120);
1515

1616
@Override
1717
protected String operate(String a, String b) {
18+
LOGGER.info("Divider process of {} |/| {}: \n", a, b);
19+
1820
// Avoids division by zero error.
1921
if(a.equals(b))
2022
return "1";
2123

22-
LOGGER.info("Division process of {} |/| {}: \n", a, b);
23-
2424
if (ExpressionUtils.isANumber(a) && ExpressionUtils.isANumber(b)) {
2525
return numericalDivision(a, b);
2626
}
2727

28+
String unsignedB = b.substring(1);
29+
if(unsignedB.contains("+") || unsignedB.contains("-")) {
30+
LOGGER.error("Unable to calculate a division, the denominator being a polynomial. Returns a/b");
31+
return a+"/"+b;
32+
}
33+
2834
List<String> numMonomials = ExpressionUtils.toMonomials(a);
2935
int index = 0;
3036
for(String numMonomial : numMonomials) {
@@ -131,7 +137,7 @@ private boolean proceedForVarDivision(String num, String den, int i, int j, List
131137
nPow = nPow.isEmpty() ? "1" : nPow;
132138
dPow = dPow.isEmpty() ? "1" : dPow;
133139

134-
String subResult = Subtraction.getInstance().rawOperate(nPow, dPow);
140+
String subResult = Subtractor.getInstance().rawOperate(nPow, dPow);
135141

136142
if(ExpressionUtils.isANumber(subResult)) {
137143
float subNumericResult = Float.parseFloat(subResult);
@@ -153,7 +159,7 @@ private String assembleFactors(List<String> factors) {
153159
BUILDER.append(1);
154160
for(String factor : factors) {
155161
if(factor != null && !factor.equals("1") && !factor.equals("1.0")) {
156-
BUILDER.replace(0, BUILDER.length(), Multiplication.getInstance().simpleMult(BUILDER.toString(), factor));
162+
BUILDER.replace(0, BUILDER.length(), Multiplicator.getInstance().simpleMult(BUILDER.toString(), factor));
157163
}
158164
}
159165
return BUILDER.toString();
@@ -197,7 +203,7 @@ public String outFormat(String origin) {
197203
return FormatterFactory.removeMultiplicationSigns(origin);
198204
}
199205

200-
public static Division getInstance() {
206+
public static Divider getInstance() {
201207
return INSTANCE;
202208
}
203209
}

src/main/java/net/akami/mask/operation/Multiplication.java src/main/java/net/akami/mask/operation/Multiplicator.java

+7-7
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@
88
import java.math.MathContext;
99
import java.util.List;
1010

11-
public class Multiplication extends BinaryOperationHandler {
11+
public class Multiplicator extends BinaryOperationHandler {
1212

13-
private static final Multiplication INSTANCE = new Multiplication();
13+
private static final Multiplicator INSTANCE = new Multiplicator();
1414
private static final MathContext CONTEXT = new MathContext(120);
1515
@Override
1616
protected String operate(String a, String b) {
@@ -23,7 +23,7 @@ protected String operate(String a, String b) {
2323
LOGGER.info("Trigonometry result : {}", result);
2424
return result;
2525
}
26-
LOGGER.info("Multiplication process of {} |*| {}: \n", a, b);
26+
LOGGER.info("Multiplicator process of {} |*| {}: \n", a, b);
2727

2828
List<String> aMonomials = ExpressionUtils.toMonomials(a);
2929
List<String> bMonomials = ExpressionUtils.toMonomials(b);
@@ -33,7 +33,7 @@ protected String operate(String a, String b) {
3333

3434
for (String part : aMonomials) {
3535
for (String part2 : bMonomials) {
36-
LOGGER.error("Treating simple mult : {} |*| {}", part, part2);
36+
LOGGER.debug("Treating simple mult : {} |*| {}", part, part2);
3737
String result = simpleMult(part, part2);
3838
LOGGER.error("Result of simple mult between {} and {} : {}", part, part2, result);
3939
boolean first = part.equals(aMonomials.get(0)) && part2.equals(bMonomials.get(0));
@@ -46,7 +46,7 @@ protected String operate(String a, String b) {
4646
}
4747
String unReducedResult = builder.toString();
4848
LOGGER.info("FINAL RESULT : {}", unReducedResult);
49-
String finalResult = Sum.getInstance().operate(unReducedResult, "");
49+
String finalResult = Adder.getInstance().operate(unReducedResult, "");
5050
LOGGER.error("- Result of mult {} |*| {} : {}", a, b, finalResult);
5151
return finalResult;
5252
}
@@ -64,7 +64,7 @@ public String simpleMult(String a, String b) {
6464

6565
String concatenated = a + "*" + b;
6666
String originalVars = ExpressionUtils.toVariables(concatenated);
67-
LOGGER.error("Variables of {} and {} : {}", a, b, originalVars);
67+
LOGGER.debug("Variables of {} and {} : {}", a, b, originalVars);
6868
a = ExpressionUtils.toNumericValue(a);
6969
b = ExpressionUtils.toNumericValue(b);
7070

@@ -104,7 +104,7 @@ public String outFormat(String origin) {
104104
return FormatterFactory.removeMultiplicationSigns(origin);
105105
}
106106

107-
public static Multiplication getInstance() {
107+
public static Multiplicator getInstance() {
108108
return INSTANCE;
109109
}
110110
}

src/main/java/net/akami/mask/operation/Pow.java src/main/java/net/akami/mask/operation/PowCalculator.java

+6-6
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@
44
import net.akami.mask.utils.FormatterFactory;
55
import net.akami.mask.utils.MathUtils;
66

7-
public class Pow extends BinaryOperationHandler {
7+
public class PowCalculator extends BinaryOperationHandler {
88

9-
private static final Pow INSTANCE = new Pow();
9+
private static final PowCalculator INSTANCE = new PowCalculator();
1010

1111
@Override
1212
public String operate(String a, String b) {
13-
LOGGER.info("Pow operation process between {} and {} : \n", a, b);
13+
LOGGER.info("PowCalculator operation process between {} and {} : \n", a, b);
1414

1515
String aVars = ExpressionUtils.toVariables(a);
1616
String bVars = ExpressionUtils.toVariables(b);
@@ -25,7 +25,7 @@ public String operate(String a, String b) {
2525
// If pow value is too high, there is no point in developing the entire expression
2626
if (bVars.length() != 0 || (powValue = Float.parseFloat(b)) > 199 ||
2727
(aVars.length() != 0 && powValue % 1 != 0)) {
28-
LOGGER.info("Pow value contains variables or pow value is greater than 199. Returns a^b");
28+
LOGGER.info("PowCalculator value contains variables or pow value is greater than 199. Returns a^b");
2929
a = ExpressionUtils.isReduced(a) ? a : "(" + a + ")";
3030
b = ExpressionUtils.isReduced(b) ? b : "(" + b + ")";
3131
return a + "^" + b;
@@ -35,7 +35,7 @@ public String operate(String a, String b) {
3535
StringBuilder builder = new StringBuilder();
3636
builder.append(a);
3737
for (int i = 1; i < powValue; i++) {
38-
builder.replace(0, builder.length(), Multiplication.getInstance().rawOperate(builder.toString(), a));
38+
builder.replace(0, builder.length(), Multiplicator.getInstance().rawOperate(builder.toString(), a));
3939
LOGGER.info("{} steps left. Currently : {}", powValue - i - 1, builder.toString());
4040
}
4141
return builder.toString();
@@ -51,7 +51,7 @@ public String outFormat(String origin) {
5151
return MathUtils.cutSignificantZero(FormatterFactory.removeMultiplicationSigns(origin));
5252
}
5353

54-
public static Pow getInstance() {
54+
public static PowCalculator getInstance() {
5555
return INSTANCE;
5656
}
5757
}

src/main/java/net/akami/mask/operation/Subtraction.java src/main/java/net/akami/mask/operation/Subtractor.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@
55

66
import java.util.List;
77

8-
public class Subtraction extends BinaryOperationHandler {
8+
public class Subtractor extends BinaryOperationHandler {
99

10-
private static final Subtraction INSTANCE = new Subtraction();
10+
private static final Subtractor INSTANCE = new Subtractor();
1111

1212
@Override
1313
protected String operate(String a, String b) {
14-
LOGGER.info("Subtraction process of {} |-| {}: \n", a, b);
14+
LOGGER.info("Subtractor process of {} |-| {}: \n", a, b);
1515

1616
List<String> monomials = ExpressionUtils.toMonomials(a);
1717
List<String> bMonomials = ExpressionUtils.toMonomials(b);
@@ -29,7 +29,7 @@ protected String operate(String a, String b) {
2929
}
3030
}
3131
monomials.addAll(bMonomials);
32-
return Sum.getInstance().monomialSum(monomials, true);
32+
return Adder.getInstance().monomialSum(monomials, true);
3333
}
3434

3535
@Override
@@ -42,7 +42,7 @@ public String outFormat(String origin) {
4242
return FormatterFactory.removeMultiplicationSigns(origin);
4343
}
4444

45-
public static Subtraction getInstance() {
45+
public static Subtractor getInstance() {
4646
return INSTANCE;
4747
}
4848
}

src/main/java/net/akami/mask/operation/sign/BinaryOperationSign.java

-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ public String compute(String a, String b) {
3636
return binaryFunction.compute(a, b);
3737
}
3838

39-
4039
public static BinaryOperationSign getBySign(char sign) {
4140
for(BinaryOperationSign operation : values()) {
4241
if(operation.sign == sign) {

src/main/java/net/akami/mask/tree/FormatterTree.java

+4
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ protected void evalBranch(Branch self) {
2525
if(ExpressionUtils.hasHigherPriority(String.valueOf(self.getOperation()), right))
2626
right = addRequiredBrackets(right);
2727

28+
if(ExpressionUtils.hasHigherPriority(String.valueOf(self.getOperation()), left))
29+
left = addRequiredBrackets(left);
30+
// TODO
31+
2832
char operation = self.getOperation();
2933

3034
if(operation == '*') {

src/main/java/net/akami/mask/utils/FormatterFactory.java

+5-11
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import java.util.List;
1010
import static net.akami.mask.utils.ExpressionUtils.MATH_SIGNS;
1111
import static net.akami.mask.utils.ExpressionUtils.VARIABLES;
12+
import static net.akami.mask.utils.ExpressionUtils.NUMBERS;
1213

1314
public class FormatterFactory {
1415

@@ -60,12 +61,6 @@ public static String formatTrigonometry(String origin) {
6061

6162
// TODO : remove 1's in front of variables, remove useless brackets
6263
public static String formatForVisual(String origin) {
63-
/*origin = origin
64-
.replaceAll("\\(\\((.*?)\\)(\\*@|@)\\)", "sin\\($1\\)")
65-
.replaceAll("\\(\\((.*?)\\)(\\*#|#)\\)", "cos\\($1\\)")
66-
.replaceAll("\\(\\((.*?)\\)(\\*§|§)\\)", "tan\\($1\\)");
67-
68-
return removeMultiplicationSigns(origin);*/
6964
BinaryTree tree = new FormatterTree(origin);
7065
return tree.merge();
7166
}
@@ -108,21 +103,20 @@ public static String addMultiplicationSigns(String self, boolean addForTrigonome
108103
BUILDER.append(c);
109104
}
110105
}
111-
LOGGER.error("Converted : " + self + " to " + BUILDER.toString());
106+
LOGGER.debug("Converted : " + self + " to " + BUILDER.toString());
112107
return BUILDER.toString();
113108
}
114109

115110
public static String addAllCoefficients(String origin) {
116111

117112
clearBuilder();
118-
for(int i = 0; i<origin.length(); i++) {
113+
for(int i = 0; i < origin.length(); i++) {
119114
String current = String.valueOf(origin.charAt(i));
120115
String previous = i == 0 ? "$" : String.valueOf(origin.charAt(i-1));
121-
122-
if(VARIABLES.contains(current) && (ExpressionUtils.MATH_SIGNS.contains(previous) || i== 0)) {
116+
String next = i == origin.length()-1 ? "$" : String.valueOf(origin.charAt(i+1));
117+
if(VARIABLES.contains(current) && (MATH_SIGNS.contains(previous) || i == 0) && !NUMBERS.contains(next)) {
123118
BUILDER.append('1');
124119
}
125-
126120
BUILDER.append(current);
127121
}
128122
return BUILDER.toString();

src/main/java/net/akami/mask/utils/MathUtils.java

+13-9
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,19 @@ public class MathUtils {
1919
private static final MathContext TRIGO_CONTEXT = new MathContext(4);
2020

2121
public static String sum(String a, String b) {
22-
return Sum.getInstance().rawOperate(a, b);
22+
return Adder.getInstance().rawOperate(a, b);
2323
}
2424
public static String sum(List<String> monomials) {
25-
return Sum.getInstance().monomialSum(monomials, true);
25+
return Adder.getInstance().monomialSum(monomials, true);
2626
}
2727
public static String subtract(String a, String b) {
28-
return Subtraction.getInstance().rawOperate(a, b);
28+
return Subtractor.getInstance().rawOperate(a, b);
2929
}
3030
public static String mult(String a, String b) {
31-
return Multiplication.getInstance().rawOperate(a, b);
31+
return Multiplicator.getInstance().rawOperate(a, b);
3232
}
3333
public static String divide(String a, String b) {
34-
return Division.getInstance().rawOperate(a, b);
34+
return Divider.getInstance().rawOperate(a, b);
3535
}
3636
public static String diffSum(String a, String altA, String b, String altB) {
3737
return sum(altA, altB);
@@ -53,9 +53,13 @@ else if(!ExpressionUtils.isReduced(subtractResult))
5353
subtractResult = "^("+subtractResult+')';
5454
else
5555
subtractResult = '^'+subtractResult;
56-
b = ExpressionUtils.isReduced(b) || ExpressionUtils.areEdgesBracketsConnected(b, true) ? b+"*" : "("+b+")*";
57-
if(!ExpressionUtils.isReduced(a))
56+
57+
if(!ExpressionUtils.isReduced(a) && !ExpressionUtils.areEdgesBracketsConnected(a, false))
5858
a = '(' + a + ')';
59+
if(!ExpressionUtils.isReduced(b) && !ExpressionUtils.areEdgesBracketsConnected(b, false))
60+
b = '(' + b + ")*";
61+
else
62+
b += '*';
5963

6064
if(altA.equals("1"))
6165
altA = "";
@@ -78,7 +82,7 @@ public static String breakNumericalFraction(String self) {
7882

7983
// TODO : optimize : use other method to chain multiplications
8084
public static String pow(String a, String b) {
81-
return Pow.getInstance().rawOperate(a, b);
85+
return PowCalculator.getInstance().rawOperate(a, b);
8286
}
8387

8488
public static String sin(String a) {
@@ -120,7 +124,7 @@ public static String highPow(String a, String b) {
120124
float powValue;
121125

122126
if (bVars.length() != 0 || (powValue = Float.parseFloat(b)) > 199) {
123-
LOGGER.info("Pow value contains variables or pow value is greater than 9. Returns a^b");
127+
LOGGER.info("PowCalculator value contains variables or pow value is greater than 9. Returns a^b");
124128
return a + "^" + (ExpressionUtils.isReduced(b) ? b : "(" + b + ")");
125129
}
126130

0 commit comments

Comments
 (0)