Symbolics   F
last analyzed

Complexity

Total Complexity 104

Size/Duplication

Total Lines 1021
Duplicated Lines 0 %

Test Coverage

Coverage 42.72%

Importance

Changes 0
Metric Value
eloc 125
dl 0
loc 1021
ccs 91
cts 213
cp 0.4272
rs 2
c 0
b 0
f 0
wmc 104

97 Methods

Rating   Name   Duplication   Size   Complexity  
A greaterThanOrEquals() 0 3 1
A multiplyExpressionWithExpression() 0 8 3
A equalsVariableVariable() 0 3 1
A greaterThanOrEqualsExpressionConstant() 0 3 1
A modifyStrength() 0 3 1
A subtractTermFromTerm() 0 3 1
A divideTermByConstant() 0 3 1
A lessThanOrEqualsExpressionTerm() 0 3 1
A negateTerm() 0 3 1
A addExpressionToExpression() 0 4 1
A addVariableToConstant() 0 3 1
A subtractExpressionFromTerm() 0 3 1
A greaterThanOrEqualsTermVariable() 0 3 1
A equalsVariableExpression() 0 3 1
A equalsExpressionTerm() 0 3 1
A equalsConstantExpression() 0 3 1
A addTermToConstant() 0 3 1
A equalsExpressionConstant() 0 3 1
A lessThanOrEqualsVariableExpression() 0 3 1
A subtractVariableFromVariable() 0 3 1
A lessThanOrEqualsConstantExpression() 0 3 1
A equalsExpressionExpression() 0 3 1
A addTermToExpression() 0 5 1
A divideVariableByConstant() 0 3 1
A multiplyTermWithConstant() 0 3 1
A _callMethodForArguments() 0 12 4
A __construct() 0 2 1
A lessThanOrEqualsTermConstant() 0 3 1
A addExpressionToConstant() 0 3 1
A equalsConstantTerm() 0 3 1
A greaterThanOrEqualsVariableExpression() 0 3 1
A lessThanOrEqualsVariableTerm() 0 3 1
A lessThanOrEqualsTermExpression() 0 3 1
A subtract() 0 3 1
A subtractExpressionFromConstant() 0 3 1
A equalsTermVariable() 0 3 1
A addTermToTerm() 0 4 1
A negate() 0 3 1
A negateExpression() 0 3 1
A greaterThanOrEqualsTermTerm() 0 3 1
A greaterThanOrEqualsExpressionTerm() 0 3 1
A greaterThanOrEqualsTermExpression() 0 3 1
A divideExpressioByConstant() 0 3 1
A multiply() 0 3 1
A equalsTermExpression() 0 3 1
A greaterThanOrEqualsTermConstant() 0 3 1
A subtractExpressionFromVariable() 0 3 1
A addConstantToExpression() 0 3 1
A greaterThanOrEqualsVariabeTerm() 0 3 1
A subtractConstantFromVariable() 0 3 1
A greaterThanOrEqualsVariableConstant() 0 3 1
A equalsExpressionVariable() 0 3 1
A subtractConstantFromTerm() 0 3 1
A equalsVariableTerm() 0 3 1
A subtractConstantFromExpression() 0 3 1
A equals() 0 3 1
A subtractVariableFromTerm() 0 3 1
A lessThanOrEqualsTermTerm() 0 3 1
A add() 0 3 1
A greaterThanOrEqualsConstantVariable() 0 3 1
A multiplyExpressionWithConstant() 0 7 2
A negateVariable() 0 3 1
A equalsTermConstant() 0 3 1
A lessThanOrEqualsExpressionVariable() 0 3 1
A greaterThanOrEqualsVariableVariable() 0 3 1
A lessThanOrEquals() 0 3 1
A addTermToVariable() 0 3 1
A greaterThanOrEqualsConstantExpression() 0 3 1
A addConstantToTerm() 0 3 1
A lessThanOrEqualsConstantTerm() 0 3 1
A subtractTermFromConstant() 0 3 1
A lessThanOrEqualsVariableConstant() 0 3 1
A lessThanOrEqualsExpressionExpression() 0 3 1
A lessThanOrEqualsConstantVariable() 0 3 1
A multiplyVariableWithConstant() 0 3 1
A subtractVariableFromConstant() 0 3 1
A addExpressionToTerm() 0 3 1
A divide() 0 3 1
A greaterThanOrEqualsExpressionVariable() 0 3 1
A addConstantToVariable() 0 3 1
A subtractExpressionFromExpression() 0 3 1
A addVariableToExpression() 0 3 1
A lessThanOrEqualsTermVariable() 0 3 1
A lessThanOrEqualsVariableVariable() 0 3 1
A lessThanOrEqualsExpressionConstant() 0 3 1
A greaterThanOrEqualsConstantTerm() 0 3 1
A subtractTermFromExpression() 0 3 1
A subtractVariableFromExpression() 0 3 1
A addVariableToTerm() 0 3 1
A addVariableToVariable() 0 3 1
A equalsVariableConstant() 0 3 1
A subtractTermFromVariable() 0 3 1
A divideExpressionByExpression() 0 6 2
A addExpressionToVariable() 0 3 1
A greaterThanOrEqualsExpressionExpression() 0 3 1
A equalsConstantVariable() 0 3 1
A equalsTermTerm() 0 3 1

How to fix   Complexity   

Complex Class

Complex classes like Symbolics often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use Symbolics, and based on these observations, apply Extract Interface, too.

1
<?php
2
declare(strict_types=1);
3
4
namespace Ctefan\Kiwi;
5
6
use Ctefan\Kiwi\Exception\NonlinearExpressionException;
7
8
class Symbolics
9
{
10
    /**
11
     * Symbolics constructor.
12
     */
13
    protected function __construct()
14
    {
15
    }
16
17
    /**
18
     * @param mixed $a
19
     * @param mixed $b
20
     * @return mixed
21
     */
22 1
    static public function multiply($a, $b)
23
    {
24 1
        return self::_callMethodForArguments($a, $b, 'multiply%sWith%s');
25
    }
26
27
    /**
28
     * @param mixed $a
29
     * @param mixed $b
30
     * @return mixed
31
     */
32
    static public function divide($a, $b)
33
    {
34
        return self::_callMethodForArguments($a, $b, 'divide%2$sBy$1$s');
35
    }
36
37
    /**
38
     * @param mixed $subject
39
     * @return mixed
40
     */
41
    static public function negate($subject)
42
    {
43
        return self::_callMethodForArguments($subject, null, 'negate%s');
44
    }
45
46
    /**
47
     * @param mixed $a
48
     * @param mixed $b
49
     * @return Expression
50
     */
51 3
    static public function add($a, $b): Expression
52
    {
53 3
        return self::_callMethodForArguments($a, $b, 'add%2$sTo%1$s');
54
    }
55
56
    /**
57
     * @param mixed $a
58
     * @param mixed $b
59
     * @return Expression
60
     */
61
    static public function subtract($a, $b): Expression
62
    {
63
        return self::_callMethodForArguments($a, $b, 'subtract$2$sFrom%1$s');
64
    }
65
66
    /**
67
     * @param mixed $a
68
     * @param mixed $b
69
     * @return Constraint
70
     */
71 18
    static public function equals($a, $b): Constraint
72
    {
73 18
        return self::_callMethodForArguments($a, $b, 'equals%s%s');
74
    }
75
76
    /**
77
     * @param mixed $a
78
     * @param mixed $b
79
     * @return Constraint
80
     */
81 11
    static public function lessThanOrEquals($a, $b): Constraint
82
    {
83 11
        return self::_callMethodForArguments($a, $b, 'lessThanOrEquals%s%s');
84
85
    }
86
87
    /**
88
     * @param mixed $a
89
     * @param mixed $b
90
     * @return Constraint
91
     */
92 8
    static public function greaterThanOrEquals($a, $b): Constraint
93
    {
94 8
        return self::_callMethodForArguments($a, $b, 'greaterThanOrEquals%s%s');
95
    }
96
97
    /**
98
     * @var array
99
     */
100
    static private $names = [
101
        Expression::class => 'Expression',
102
        Term::class => 'Term',
103
        Variable::class => 'Variable',
104
        'double' => 'Constant',
105
        'integer' => 'Constant',
106
        'NULL' => '',
107
    ];
108
109
    /**
110
     * @param mixed $a
111
     * @param mixed $b
112
     * @param string $format
113
     * @return mixed
114
     */
115 21
    static private function _callMethodForArguments($a, $b, string $format)
116
    {
117
        // TODO check for invalid argument types
118 21
        $methodName = sprintf(
119 21
            $format,
120 21
            self::$names[is_object($a) ? get_class($a) : gettype($a)],
121 21
            self::$names[is_object($b) ? get_class($b) : gettype($b)]
122
        );
123 21
        if (false === method_exists(self::class, $methodName)) {
124
            throw new \InvalidArgumentException("Method $methodName does not exist.");
125
        }
126 21
        return self::$methodName($a, $b);
127
    }
128
129
130
    /*
131
     * Term factory methods.
132
     */
133
134
    /**
135
     * @param Variable $variable
136
     * @param float $coefficient
137
     * @return Term
138
     */
139 1
    static public function multiplyVariableWithConstant(Variable $variable, float $coefficient): Term
140
    {
141 1
        return new Term($variable, $coefficient);
142
    }
143
144
    /**
145
     * @param Variable $variable
146
     * @param float $denominator
147
     * @return Term
148
     */
149
    static public function divideVariableByConstant(Variable $variable, float $denominator): Term
150
    {
151
        return self::multiplyVariableWithConstant($variable, 1.0 / $denominator);
152
    }
153
154
    /**
155
     * @param Variable $variable
156
     * @return Term
157
     */
158
    static public function negateVariable(Variable $variable): Term
159
    {
160
        return self::multiply($variable, -1.0);
161
    }
162
163
    /**
164
     * @param Term $term
165
     * @param float $coefficient
166
     * @return Term
167
     */
168 13
    static public function multiplyTermWithConstant(Term $term, float $coefficient): Term
169
    {
170 13
        return new Term($term->getVariable(), $term->getCoefficient() * $coefficient);
171
    }
172
173
    /**
174
     * @param Term $term
175
     * @param float $denominator
176
     * @return Term
177
     */
178
    static public function divideTermByConstant(Term $term, float $denominator): Term
179
    {
180
        return self::multiplyTermWithConstant($term, 1.0 / $denominator);
181
    }
182
183
    /**
184
     * @param Term $term
185
     * @return Term
186
     */
187
    static public function negateTerm(Term $term): Term
188
    {
189
        return self::multiplyTermWithConstant($term, -1.0);
190
    }
191
192
193
    /*
194
     * Expression factory methods.
195
     */
196
197
    /**
198
     * @param Expression $expression
199
     * @param float $coefficient
200
     * @return Expression
201
     */
202 21
    static public function multiplyExpressionWithConstant(Expression $expression, float $coefficient): Expression
203
    {
204 21
        $terms = [];
205 21
        foreach ($expression->getTerms() as $term) {
206 13
            $terms[] = self::multiplyTermWithConstant($term, $coefficient);
207
        }
208 21
        return new Expression($terms, $expression->getConstant() * $coefficient);
209
    }
210
211
    /**
212
     * @param Expression $a
213
     * @param Expression $b
214
     * @return Expression
215
     * @throws NonlinearExpressionException
216
     */
217
    static public function multiplyExpressionWithExpression(Expression $a, Expression $b): Expression
218
    {
219
        if (true === $a->isConstant()) {
220
            return self::multiplyExpressionWithConstant($b, $a->getConstant());
221
        } elseif (true === $b->isConstant()) {
222
            return self::multiplyExpressionWithConstant($a, $b->getConstant());
223
        } else {
224
            throw new NonlinearExpressionException();
225
        }
226
    }
227
228
    /**
229
     * @param Expression $expression
230
     * @param float $denominator
231
     * @return Expression
232
     */
233
    static public function divideExpressioByConstant(Expression $expression, float $denominator): Expression
234
    {
235
        return self::multiplyExpressionWithConstant($expression, 1.0 / $denominator);
236
    }
237
238
    /**
239
     * @param Expression $a
240
     * @param Expression $b
241
     * @return Expression
242
     * @throws NonlinearExpressionException
243
     */
244
    static public function divideExpressionByExpression(Expression $a, Expression $b): Expression
245
    {
246
        if (true === $b->isConstant()) {
247
            return self::divideExpressioByConstant($a, $b->getConstant());
248
        } else {
249
            throw new NonlinearExpressionException();
250
        }
251
    }
252
253
    /**
254
     * @param Expression $expression
255
     * @return Expression
256
     */
257 21
    static public function negateExpression(Expression $expression): Expression
258
    {
259 21
        return self::multiplyExpressionWithConstant($expression, -1.0);
260
    }
261
262
    /**
263
     * @param Expression $a
264
     * @param Expression $b
265
     * @return Expression
266
     */
267 21
    static public function addExpressionToExpression(Expression $a, Expression $b): Expression
268
    {
269 21
        $terms = array_merge($a->getTerms(), $b->getTerms());
270 21
        return new Expression($terms, $a->getConstant() + $b->getConstant());
271
    }
272
273
    /**
274
     * @param Expression $expression
275
     * @param Term $term
276
     * @return Expression
277
     */
278
    static public function addTermToExpression(Expression $expression, Term $term): Expression
279
    {
280
        $terms = $expression->getTerms();
281
        $terms[] = $term;
282
        return new Expression($terms, $expression->getConstant());
283
    }
284
285
    /**
286
     * @param Expression $expression
287
     * @param Variable $variable
288
     * @return Expression
289
     */
290
    static public function addVariableToExpression(Expression $expression, Variable $variable): Expression
291
    {
292
        return self::addTermToExpression($expression, new Term($variable));
293
    }
294
295
    /**
296
     * @param Expression $expression
297
     * @param float $constant
298
     * @return Expression
299
     */
300
    static public function addConstantToExpression(Expression $expression, float $constant): Expression
301
    {
302
        return new Expression($expression->getTerms(), $expression->getConstant() + $constant);
303
    }
304
305
    /**
306
     * @param Expression $a
307
     * @param Expression $b
308
     * @return Expression
309
     */
310 21
    static public function subtractExpressionFromExpression(Expression $a, Expression $b): Expression
311
    {
312 21
        return self::addExpressionToExpression($a, self::negateExpression($b));
313
    }
314
315
    /**
316
     * @param Expression $expression
317
     * @param Term $term
318
     * @return Expression
319
     */
320
    static public function subtractTermFromExpression(Expression $expression, Term $term): Expression
321
    {
322
        return self::addTermToExpression($expression, self::negateTerm($term));
323
    }
324
325
    /**
326
     * @param Expression $expression
327
     * @param Variable $variable
328
     * @return Expression
329
     */
330
    static public function subtractVariableFromExpression(Expression $expression, Variable $variable): Expression
331
    {
332
        return self::addTermToExpression($expression, self::negateVariable($variable));
333
    }
334
335
    /**
336
     * @param Expression $expression
337
     * @param float $constant
338
     * @return Expression
339
     */
340
    static public function subtractConstantFromExpression(Expression $expression, float $constant): Expression
341
    {
342
        return self::addConstantToExpression($expression, -$constant);
343
    }
344
345
    /**
346
     * @param Term $term
347
     * @param Expression $expression
348
     * @return Expression
349
     */
350
    static public function addExpressionToTerm(Term $term, Expression $expression): Expression
351
    {
352
        return self::addTermToExpression($expression, $term);
353
    }
354
355
    /**
356
     * @param Term $a
357
     * @param Term $b
358
     * @return Expression
359
     */
360
    static public function addTermToTerm(Term $a, Term $b): Expression
361
    {
362
        $terms = [$a, $b];
363
        return new Expression($terms);
364
    }
365
366
    /**
367
     * @param Term $term
368
     * @param Variable $variable
369
     * @return Expression
370
     */
371
    static public function addVariableToTerm(Term $term, Variable $variable): Expression
372
    {
373
        return self::addTermToTerm($term, new Term($variable));
374
    }
375
376
    /**
377
     * @param Term $term
378
     * @param float $constant
379
     * @return Expression
380
     */
381 3
    static public function addConstantToTerm(Term $term, float $constant): Expression
382
    {
383 3
        return new Expression([$term], $constant);
384
    }
385
386
    /**
387
     * @param Term $term
388
     * @param Expression $expression
389
     * @return Expression
390
     */
391
    static public function subtractExpressionFromTerm(Term $term, Expression $expression): Expression
392
    {
393
        return self::addTermToExpression(self::negateExpression($expression), $term);
394
    }
395
396
    /**
397
     * @param Term $a
398
     * @param Term $b
399
     * @return Expression
400
     */
401
    static public function subtractTermFromTerm(Term $a, Term $b): Expression
402
    {
403
        return self::addTermToTerm($a, self::negateTerm($b));
404
    }
405
406
    /**
407
     * @param Term $term
408
     * @param Variable $variable
409
     * @return Expression
410
     */
411
    static public function subtractVariableFromTerm(Term $term, Variable $variable): Expression
412
    {
413
        return self::addTermToTerm($term, self::negateVariable($variable));
414
    }
415
416
    /**
417
     * @param Term $term
418
     * @param float $constant
419
     * @return Expression
420
     */
421
    static public function subtractConstantFromTerm(Term $term, float $constant): Expression
422
    {
423
        return self::addConstantToTerm($term, -$constant);
424
    }
425
426
    /**
427
     * @param Variable $variable
428
     * @param Expression $expression
429
     * @return Expression
430
     */
431
    static public function addExpressionToVariable(Variable $variable, Expression $expression): Expression
432
    {
433
        return self::addVariableToExpression($expression, $variable);
434
    }
435
436
    /**
437
     * @param Variable $variable
438
     * @param Term $term
439
     * @return Expression
440
     */
441
    static public function addTermToVariable(Variable $variable, Term $term): Expression
442
    {
443
        return self::addVariableToTerm($term, $variable);
444
    }
445
446
    /**
447
     * @param Variable $a
448
     * @param Variable $b
449
     * @return Expression
450
     */
451
    static public function addVariableToVariable(Variable $a, Variable $b): Expression
452
    {
453
        return self::addVariableToTerm(new Term($a), $b);
454
    }
455
456
    /**
457
     * @param Variable $variable
458
     * @param float $constant
459
     * @return Expression
460
     */
461 3
    static public function addConstantToVariable(Variable $variable, float $constant): Expression
462
    {
463 3
        return self::addConstantToTerm(new Term($variable), $constant);
464
    }
465
466
    /**
467
     * @param Variable $variable
468
     * @param Expression $expression
469
     * @return Expression
470
     */
471
    static public function subtractExpressionFromVariable(Variable $variable, Expression $expression): Expression
472
    {
473
        return self::addExpressionToVariable($variable, self::negateExpression($expression));
474
    }
475
476
    /**
477
     * @param Variable $variable
478
     * @param Term $term
479
     * @return Expression
480
     */
481
    static public function subtractTermFromVariable(Variable $variable, Term $term): Expression
482
    {
483
        return self::addTermToVariable($variable, self::negateTerm($term));
484
    }
485
486
    /**
487
     * @param Variable $a
488
     * @param Variable $b
489
     * @return Expression
490
     */
491
    static public function subtractVariableFromVariable(Variable $a, Variable $b): Expression
492
    {
493
        return self::addTermToVariable($a, self::negateVariable($b));
494
    }
495
496
    /**
497
     * @param Variable $variable
498
     * @param float $constant
499
     * @return Expression
500
     */
501
    static public function subtractConstantFromVariable(Variable $variable, float $constant): Expression
502
    {
503
        return self::addConstantToVariable($variable, -$constant);
504
    }
505
506
    /**
507
     * @param float $constant
508
     * @param Expression $expression
509
     * @return Expression
510
     */
511
    static public function addExpressionToConstant(float $constant, Expression $expression): Expression
512
    {
513
        return self::addConstantToExpression($expression, $constant);
514
    }
515
516
    /**
517
     * @param float $constant
518
     * @param Term $term
519
     * @return Expression
520
     */
521
    static public function addTermToConstant(float $constant, Term $term): Expression
522
    {
523
        return self::addConstantToTerm($term, $constant);
524
    }
525
526
    /**
527
     * @param float $constant
528
     * @param Variable $variable
529
     * @return Expression
530
     */
531
    static public function addVariableToConstant(float $constant, Variable $variable): Expression
532
    {
533
        return self::addConstantToVariable($variable, $constant);
534
    }
535
536
    /**
537
     * @param float $constant
538
     * @param Expression $expression
539
     * @return Expression
540
     */
541
    static public function subtractExpressionFromConstant(float $constant, Expression $expression): Expression
542
    {
543
        return self::addConstantToExpression(self::negateExpression($expression), $constant);
544
    }
545
546
    /**
547
     * @param float $constant
548
     * @param Term $term
549
     * @return Expression
550
     */
551
    static public function subtractTermFromConstant(float $constant, Term $term): Expression
552
    {
553
        return self::addConstantToTerm(self::negateTerm($term), $constant);
554
    }
555
556
    /**
557
     * @param float $constant
558
     * @param Variable $variable
559
     * @return Expression
560
     */
561
    static public function subtractVariableFromConstant(float $constant, Variable $variable): Expression
562
    {
563
        return self::addConstantToTerm(self::negateVariable($variable), $constant);
564
    }
565
566
567
    /*
568
     * Constraint factory methods.
569
     */
570
571
    /**
572
     * @param Expression $a
573
     * @param Expression $b
574
     * @return Constraint
575
     */
576 18
    static public function equalsExpressionExpression(Expression $a, Expression $b): Constraint
577
    {
578 18
        return new Constraint(self::subtractExpressionFromExpression($a, $b), RelationalOperator::EQ);
579
    }
580
581
    /**
582
     * @param Expression $expression
583
     * @param Term $term
584
     * @return Constraint
585
     */
586 3
    static public function equalsExpressionTerm(Expression $expression, Term $term): Constraint
587
    {
588 3
        return self::equalsExpressionExpression($expression, Expression::createFromTerm($term));
589
    }
590
591
    /**
592
     * @param Expression $expression
593
     * @param Variable $variable
594
     * @return Constraint
595
     */
596 3
    static public function equalsExpressionVariable(Expression $expression, Variable $variable): Constraint
597
    {
598 3
        return self::equalsExpressionTerm($expression, new Term($variable));
599
    }
600
601
    /**
602
     * @param Expression $expression
603
     * @param float $constant
604
     * @return Constraint
605
     */
606 17
    static public function equalsExpressionConstant(Expression $expression, float $constant): Constraint
607
    {
608 17
        return self::equalsExpressionExpression($expression, new Expression([], $constant));
609
    }
610
611
    /**
612
     * @param Expression $a
613
     * @param Expression $b
614
     * @return Constraint
615
     */
616 11
    static public function lessThanOrEqualsExpressionExpression(Expression $a, Expression $b): Constraint
617
    {
618 11
        return new Constraint(self::subtractExpressionFromExpression($a, $b), RelationalOperator::LE);
619
    }
620
621
    /**
622
     * @param Expression $expression
623
     * @param Term $term
624
     * @return Constraint
625
     */
626 5
    static public function lessThanOrEqualsExpressionTerm(Expression $expression, Term $term): Constraint
627
    {
628 5
        return self::lessThanOrEqualsExpressionExpression($expression, Expression::createFromTerm($term));
629
    }
630
631
    /**
632
     * @param Expression $expression
633
     * @param Variable $variable
634
     * @return Constraint
635
     */
636 5
    static public function lessThanOrEqualsExpressionVariable(Expression $expression, Variable $variable): Constraint
637
    {
638 5
        return self::lessThanOrEqualsExpressionTerm($expression, new Term($variable));
639
    }
640
641
    /**
642
     * @param Expression $expression
643
     * @param float $constant
644
     * @return Constraint
645
     */
646 6
    static public function lessThanOrEqualsExpressionConstant(Expression $expression, float $constant): Constraint
647
    {
648 6
        return self::lessThanOrEqualsExpressionExpression($expression, new Expression([], $constant));
649
    }
650
651
    /**
652
     * @param Expression $a
653
     * @param Expression $b
654
     * @return Constraint
655
     */
656 8
    static public function greaterThanOrEqualsExpressionExpression(Expression $a, Expression $b): Constraint
657
    {
658 8
        return new Constraint(self::subtractExpressionFromExpression($a, $b), RelationalOperator::GE);
659
    }
660
661
    /**
662
     * @param Expression $expression
663
     * @param Term $term
664
     * @return Constraint
665
     */
666 5
    static public function greaterThanOrEqualsExpressionTerm(Expression $expression, Term $term): Constraint
667
    {
668 5
        return self::greaterThanOrEqualsExpressionExpression($expression, Expression::createFromTerm($term));
669
    }
670
671
    /**
672
     * @param Expression $expression
673
     * @param Variable $variable
674
     * @return Constraint
675
     */
676 5
    static public function greaterThanOrEqualsExpressionVariable(Expression $expression, Variable $variable): Constraint
677
    {
678 5
        return self::greaterThanOrEqualsExpressionTerm($expression, new Term($variable));
679
    }
680
681
    /**
682
     * @param Expression $expression
683
     * @param float $constant
684
     * @return Constraint
685
     */
686 4
    static public function greaterThanOrEqualsExpressionConstant(Expression $expression, float $constant): Constraint
687
    {
688 4
        return self::greaterThanOrEqualsExpressionExpression($expression, new Expression([], $constant));
689
    }
690
691
    /**
692
     * @param Term $term
693
     * @param Expression $expression
694
     * @return Constraint
695
     */
696
    static public function equalsTermExpression(Term $term, Expression $expression): Constraint
697
    {
698
        return self::equalsExpressionExpression(Expression::createFromTerm($term), $expression);
699
    }
700
701
    /**
702
     * @param Term $a
703
     * @param Term $b
704
     * @return Constraint
705
     */
706
    static public function equalsTermTerm(Term $a, Term $b): Constraint
707
    {
708
        return self::equalsExpressionTerm(Expression::createFromTerm($a), $b);
709
    }
710
711
    /**
712
     * @param Term $term
713
     * @param Variable $variable
714
     * @return Constraint
715
     */
716 2
    static public function equalsTermVariable(Term $term, Variable $variable): Constraint
717
    {
718 2
        return self::equalsExpressionVariable(Expression::createFromTerm($term), $variable);
719
    }
720
721
    /**
722
     * @param Term $term
723
     * @param float $constant
724
     * @return Constraint
725
     */
726 16
    static public function equalsTermConstant(Term $term, float $constant): Constraint
727
    {
728 16
        return self::equalsExpressionConstant(Expression::createFromTerm($term), $constant);
729
    }
730
731
    /**
732
     * @param Term $term
733
     * @param Expression $expression
734
     * @return Constraint
735
     */
736
    static public function lessThanOrEqualsTermExpression(Term $term, Expression $expression): Constraint
737
    {
738
        return self::lessThanOrEqualsExpressionExpression(Expression::createFromTerm($term), $expression);
739
    }
740
741
    /**
742
     * @param Term $a
743
     * @param Term $b
744
     * @return Constraint
745
     */
746
    static public function lessThanOrEqualsTermTerm(Term $a, Term $b): Constraint
747
    {
748
        return self::lessThanOrEqualsExpressionTerm(Expression::createFromTerm($a), $b);
749
    }
750
751
    /**
752
     * @param Term $term
753
     * @param Variable $variable
754
     * @return Constraint
755
     */
756 1
    static public function lessThanOrEqualsTermVariable(Term $term, Variable $variable): Constraint
757
    {
758 1
        return self::lessThanOrEqualsExpressionVariable(Expression::createFromTerm($term), $variable);
759
    }
760
761
    /**
762
     * @param Term $term
763
     * @param float $constant
764
     * @return Constraint
765
     */
766 6
    static public function lessThanOrEqualsTermConstant(Term $term, float $constant): Constraint
767
    {
768 6
        return self::lessThanOrEqualsExpressionConstant(Expression::createFromTerm($term), $constant);
769
    }
770
771
    /**
772
     * @param Term $term
773
     * @param Expression $expression
774
     * @return Constraint
775
     */
776
    static public function greaterThanOrEqualsTermExpression(Term $term, Expression $expression): Constraint
777
    {
778
        return self::greaterThanOrEqualsExpressionExpression(Expression::createFromTerm($term), $expression);
779
    }
780
781
    /**
782
     * @param Term $a
783
     * @param Term $b
784
     * @return Constraint
785
     */
786
    static public function greaterThanOrEqualsTermTerm(Term $a, Term $b): Constraint
787
    {
788
        return self::greaterThanOrEqualsExpressionTerm(Expression::createFromTerm($a), $b);
789
    }
790
791
    /**
792
     * @param Term $term
793
     * @param Variable $variable
794
     * @return Constraint
795
     */
796 1
    static public function greaterThanOrEqualsTermVariable(Term $term, Variable $variable): Constraint
797
    {
798 1
        return self::greaterThanOrEqualsExpressionVariable(Expression::createFromTerm($term), $variable);
799
    }
800
801
    /**
802
     * @param Term $term
803
     * @param float $constant
804
     * @return Constraint
805
     */
806 4
    static public function greaterThanOrEqualsTermConstant(Term $term, float $constant): Constraint
807
    {
808 4
        return self::greaterThanOrEqualsExpressionConstant(Expression::createFromTerm($term), $constant);
809
    }
810
811
    /**
812
     * @param Variable $variable
813
     * @param Expression $expression
814
     * @return Constraint
815
     */
816 1
    static public function equalsVariableExpression(Variable $variable, Expression $expression): Constraint
817
    {
818 1
        return self::equalsExpressionVariable($expression, $variable);
819
    }
820
821
    /**
822
     * @param Variable $variable
823
     * @param Term $term
824
     * @return Constraint
825
     */
826
    static public function equalsVariableTerm(Variable $variable, Term $term): Constraint
827
    {
828
        return self::equalsTermVariable($term, $variable);
829
    }
830
831
    /**
832
     * @param Variable $a
833
     * @param Variable $b
834
     * @return Constraint
835
     */
836 1
    static public function equalsVariableVariable(Variable $a, Variable $b): Constraint
837
    {
838 1
        return self::equalsTermVariable(new Term($a), $b);
839
    }
840
841
    /**
842
     * @param Variable $variable
843
     * @param float $constant
844
     * @return Constraint
845
     */
846 16
    static public function equalsVariableConstant(Variable $variable, float $constant): Constraint
847
    {
848 16
        return self::equalsTermConstant(new Term($variable), $constant);
849
    }
850
851
    /**
852
     * @param Variable $variable
853
     * @param Expression $expression
854
     * @return Constraint
855
     */
856
    static public function lessThanOrEqualsVariableExpression(Variable $variable, Expression $expression): Constraint
857
    {
858
        return self::lessThanOrEqualsTermExpression(new Term($variable), $expression);
859
    }
860
861
    /**
862
     * @param Variable $variable
863
     * @param Term $term
864
     * @return Constraint
865
     */
866
    static public function lessThanOrEqualsVariableTerm(Variable $variable, Term $term): Constraint
867
    {
868
        return self::lessThanOrEqualsTermTerm(new Term($variable), $term);
869
    }
870
871
    /**
872
     * @param Variable $a
873
     * @param Variable $b
874
     * @return Constraint
875
     */
876 1
    static public function lessThanOrEqualsVariableVariable(Variable $a, Variable $b): Constraint
877
    {
878 1
        return self::lessThanOrEqualsTermVariable(new Term($a), $b);
879
    }
880
881
    /**
882
     * @param Variable $variable
883
     * @param float $constant
884
     * @return Constraint
885
     */
886 6
    static public function lessThanOrEqualsVariableConstant(Variable $variable, float $constant): Constraint
887
    {
888 6
        return self::lessThanOrEqualsTermConstant(new Term($variable), $constant);
889
    }
890
891
    /**
892
     * @param Variable $variable
893
     * @param Expression $expression
894
     * @return Constraint
895
     */
896
    static public function greaterThanOrEqualsVariableExpression(Variable $variable, Expression $expression): Constraint
897
    {
898
        return self::greaterThanOrEqualsTermExpression(new Term($variable), $expression);
899
    }
900
901
    /**
902
     * @param Variable $variable
903
     * @param Term $term
904
     * @return Constraint
905
     */
906
    static public function greaterThanOrEqualsVariabeTerm(Variable $variable, Term $term): Constraint
907
    {
908
        return self::greaterThanOrEqualsTermTerm(new Term($variable), $term);
909
    }
910
911
    /**
912
     * @param Variable $a
913
     * @param Variable $b
914
     * @return Constraint
915
     */
916 1
    static public function greaterThanOrEqualsVariableVariable(Variable $a, Variable $b): Constraint
917
    {
918 1
        return self::greaterThanOrEqualsTermVariable(new Term($a), $b);
919
    }
920
921
    /**
922
     * @param Variable $variable
923
     * @param float $constant
924
     * @return Constraint
925
     */
926 4
    static public function greaterThanOrEqualsVariableConstant(Variable $variable, float $constant): Constraint
927
    {
928 4
        return self::greaterThanOrEqualsTermConstant(new Term($variable), $constant);
929
    }
930
931
    /**
932
     * @param float $constant
933
     * @param Expression $expression
934
     * @return Constraint
935
     */
936
    static public function equalsConstantExpression(float $constant, Expression $expression): Constraint
937
    {
938
        return self::equalsExpressionConstant($expression, $constant);
939
    }
940
941
    /**
942
     * @param float $constant
943
     * @param Term $term
944
     * @return Constraint
945
     */
946
    static public function equalsConstantTerm(float $constant, Term $term): Constraint
947
    {
948
        return self::equalsTermConstant($term, $constant);
949
    }
950
951
    /**
952
     * @param float $constant
953
     * @param Variable $variable
954
     * @return Constraint
955
     */
956
    static public function equalsConstantVariable(float $constant, Variable $variable): Constraint
957
    {
958
        return self::equalsVariableConstant($variable, $constant);
959
    }
960
961
    /**
962
     * @param float $constant
963
     * @param Expression $expression
964
     * @return Constraint
965
     */
966
    static public function lessThanOrEqualsConstantExpression(float $constant, Expression $expression): Constraint
967
    {
968
        return self::lessThanOrEqualsExpressionExpression(new Expression([], $constant), $expression);
969
    }
970
971
    /**
972
     * @param float $constant
973
     * @param Term $term
974
     * @return Constraint
975
     */
976
    static public function lessThanOrEqualsConstantTerm(float $constant, Term $term): Constraint
977
    {
978
        return self::lessThanOrEqualsExpressionTerm(new Expression([], $constant), $term);
979
    }
980
981
    /**
982
     * @param float $constant
983
     * @param Variable $variable
984
     * @return Constraint
985
     */
986 2
    static public function lessThanOrEqualsConstantVariable(float $constant, Variable $variable): Constraint
987
    {
988 2
        return self::lessThanOrEqualsExpressionVariable(new Expression([], $constant), $variable);
989
    }
990
991
    /**
992
     * @param float $constant
993
     * @param Expression $expression
994
     * @return Constraint
995
     */
996
    static public function greaterThanOrEqualsConstantExpression(float $constant, Expression $expression): Constraint
997
    {
998
        return self::greaterThanOrEqualsExpressionExpression(new Expression([], $constant), $expression);
999
    }
1000
1001
    /**
1002
     * @param float $constant
1003
     * @param Term $term
1004
     * @return Constraint
1005
     */
1006
    static public function greaterThanOrEqualsConstantTerm(float $constant, Term $term): Constraint
1007
    {
1008
        return self::greaterThanOrEqualsExpressionTerm(new Expression([], $constant), $term);
1009
    }
1010
1011
    /**
1012
     * @param float $constant
1013
     * @param Variable $variable
1014
     * @return Constraint
1015
     */
1016 2
    static public function greaterThanOrEqualsConstantVariable(float $constant, Variable $variable): Constraint
1017
    {
1018 2
        return self::greaterThanOrEqualsExpressionVariable(new Expression([], $constant), $variable);
1019
    }
1020
1021
    /**
1022
     * @param Constraint $constraint
1023
     * @param float $strength
1024
     * @return Constraint
1025
     */
1026
    static public function modifyStrength(Constraint $constraint, float $strength): Constraint
1027
    {
1028
        return Constraint::createFromConstraint($constraint, $strength);
1029
    }
1030
}