001// Copyright (c) FIRST and other WPILib contributors.
002// Open Source Software; you can modify and/or share it under the terms of
003// the WPILib BSD license file in the root directory of this project.
004
005package org.wpilib.math.optimization;
006
007import java.util.ArrayList;
008import org.ejml.simple.SimpleMatrix;
009import org.wpilib.math.autodiff.Variable;
010import org.wpilib.math.autodiff.VariableBlock;
011import org.wpilib.math.autodiff.VariableMatrix;
012
013/** Constraint creation helper functions. */
014public final class Constraints {
015  /** Utility class. */
016  private Constraints() {}
017
018  // ==
019
020  /**
021   * Equality operator that returns an equality constraint for a double and a Variable.
022   *
023   * @param lhs Left-hand side.
024   * @param rhs Right-hand side.
025   * @return Equality constraints.
026   */
027  public static EqualityConstraints eq(double lhs, Variable rhs) {
028    return eq(new Variable(lhs), rhs);
029  }
030
031  /**
032   * Equality operator that returns an equality constraint for a Variable and a double.
033   *
034   * @param lhs Left-hand side.
035   * @param rhs Right-hand side.
036   * @return Equality constraints.
037   */
038  public static EqualityConstraints eq(Variable lhs, double rhs) {
039    return eq(lhs, new Variable(rhs));
040  }
041
042  /**
043   * Equality operator that returns an equality constraint for two Variables.
044   *
045   * @param lhs Left-hand side.
046   * @param rhs Right-hand side.
047   * @return Equality constraints.
048   */
049  public static EqualityConstraints eq(Variable lhs, Variable rhs) {
050    return new EqualityConstraints(new Variable[] {lhs.minus(rhs)});
051  }
052
053  /**
054   * Equality operator that returns an equality constraint for a double and a VariableBlock.
055   *
056   * @param lhs Left-hand side.
057   * @param rhs Right-hand side.
058   * @return Equality constraints.
059   */
060  public static EqualityConstraints eq(double lhs, VariableBlock rhs) {
061    return eq(new Variable(lhs), new VariableMatrix(rhs));
062  }
063
064  /**
065   * Equality operator that returns an equality constraint for a Variable and a VariableBlock.
066   *
067   * @param lhs Left-hand side.
068   * @param rhs Right-hand side.
069   * @return Equality constraints.
070   */
071  public static EqualityConstraints eq(Variable lhs, VariableBlock rhs) {
072    return eq(lhs, new VariableMatrix(rhs));
073  }
074
075  /**
076   * Equality operator that returns an equality constraint for a double and a VariableMatrix.
077   *
078   * @param lhs Left-hand side.
079   * @param rhs Right-hand side.
080   * @return Equality constraints.
081   */
082  public static EqualityConstraints eq(double lhs, VariableMatrix rhs) {
083    return eq(new Variable(lhs), rhs);
084  }
085
086  /**
087   * Equality operator that returns an equality constraint for a Variable and a VariableMatrix.
088   *
089   * @param lhs Left-hand side.
090   * @param rhs Right-hand side.
091   * @return Equality constraints.
092   */
093  public static EqualityConstraints eq(Variable lhs, VariableMatrix rhs) {
094    var constraints = new ArrayList<Variable>(rhs.rows() * rhs.cols());
095    for (int row = 0; row < rhs.rows(); ++row) {
096      for (int col = 0; col < rhs.cols(); ++col) {
097        constraints.add(lhs.minus(rhs.get(row, col)));
098      }
099    }
100
101    var array = new Variable[constraints.size()];
102    return new EqualityConstraints(constraints.toArray(array));
103  }
104
105  /**
106   * Equality operator that returns an equality constraint for a VariableBlock and a double.
107   *
108   * @param lhs Left-hand side.
109   * @param rhs Right-hand side.
110   * @return Equality constraints.
111   */
112  public static EqualityConstraints eq(VariableBlock lhs, double rhs) {
113    return eq(new VariableMatrix(lhs), new Variable(rhs));
114  }
115
116  /**
117   * Equality operator that returns an equality constraint for a VariableBlock and a Variable.
118   *
119   * @param lhs Left-hand side.
120   * @param rhs Right-hand side.
121   * @return Equality constraints.
122   */
123  public static EqualityConstraints eq(VariableBlock lhs, Variable rhs) {
124    return eq(new VariableMatrix(lhs), rhs);
125  }
126
127  /**
128   * Equality operator that returns an equality constraint for a VariableMatrix and a double.
129   *
130   * @param lhs Left-hand side.
131   * @param rhs Right-hand side.
132   * @return Equality constraints.
133   */
134  public static EqualityConstraints eq(VariableMatrix lhs, double rhs) {
135    return eq(lhs, new Variable(rhs));
136  }
137
138  /**
139   * Equality operator that returns an equality constraint for a VariableMatrix and a Variable.
140   *
141   * @param lhs Left-hand side.
142   * @param rhs Right-hand side.
143   * @return Equality constraints.
144   */
145  public static EqualityConstraints eq(VariableMatrix lhs, Variable rhs) {
146    var constraints = new ArrayList<Variable>(lhs.rows() * lhs.cols());
147    for (int row = 0; row < lhs.rows(); ++row) {
148      for (int col = 0; col < lhs.cols(); ++col) {
149        constraints.add(lhs.get(row, col).minus(rhs));
150      }
151    }
152
153    var array = new Variable[constraints.size()];
154    return new EqualityConstraints(constraints.toArray(array));
155  }
156
157  /**
158   * Equality operator that returns an equality constraint for two VariableBlocks.
159   *
160   * @param lhs Left-hand side.
161   * @param rhs Right-hand side.
162   * @return Equality constraints.
163   */
164  public static EqualityConstraints eq(VariableBlock lhs, VariableBlock rhs) {
165    return eq(new VariableMatrix(lhs), new VariableMatrix(rhs));
166  }
167
168  /**
169   * Equality operator that returns an equality constraint for a VariableBlock and a VariableMatrix.
170   *
171   * @param lhs Left-hand side.
172   * @param rhs Right-hand side.
173   * @return Equality constraints.
174   */
175  public static EqualityConstraints eq(VariableBlock lhs, VariableMatrix rhs) {
176    return eq(new VariableMatrix(lhs), rhs);
177  }
178
179  /**
180   * Equality operator that returns an equality constraint for a VariableMatrix and a VariableBlock.
181   *
182   * @param lhs Left-hand side.
183   * @param rhs Right-hand side.
184   * @return Equality constraints.
185   */
186  public static EqualityConstraints eq(VariableMatrix lhs, VariableBlock rhs) {
187    return eq(lhs, new VariableMatrix(rhs));
188  }
189
190  /**
191   * Equality operator that returns an equality constraint for a double[][] and a VariableBlock.
192   *
193   * @param lhs Left-hand side.
194   * @param rhs Right-hand side.
195   * @return Equality constraints.
196   */
197  public static EqualityConstraints eq(double[][] lhs, VariableBlock rhs) {
198    return eq(new VariableMatrix(lhs), new VariableMatrix(rhs));
199  }
200
201  /**
202   * Equality operator that returns an equality constraint for a SimpleMatrix and a VariableBlock.
203   *
204   * @param lhs Left-hand side.
205   * @param rhs Right-hand side.
206   * @return Equality constraints.
207   */
208  public static EqualityConstraints eq(SimpleMatrix lhs, VariableBlock rhs) {
209    return eq(new VariableMatrix(lhs), new VariableMatrix(rhs));
210  }
211
212  /**
213   * Equality operator that returns an equality constraint for a double array and a VariableMatrix.
214   *
215   * @param lhs Left-hand side.
216   * @param rhs Right-hand side.
217   * @return Equality constraints.
218   */
219  public static EqualityConstraints eq(double[][] lhs, VariableMatrix rhs) {
220    return eq(new VariableMatrix(lhs), rhs);
221  }
222
223  /**
224   * Equality operator that returns an equality constraint for a SimpleMatrix and a VariableMatrix.
225   *
226   * @param lhs Left-hand side.
227   * @param rhs Right-hand side.
228   * @return Equality constraints.
229   */
230  public static EqualityConstraints eq(SimpleMatrix lhs, VariableMatrix rhs) {
231    return eq(new VariableMatrix(lhs), rhs);
232  }
233
234  /**
235   * Equality operator that returns an equality constraint for a VariableBlock and a double array.
236   *
237   * @param lhs Left-hand side.
238   * @param rhs Right-hand side.
239   * @return Equality constraints.
240   */
241  public static EqualityConstraints eq(VariableBlock lhs, double[][] rhs) {
242    return eq(new VariableMatrix(lhs), new VariableMatrix(rhs));
243  }
244
245  /**
246   * Equality operator that returns an equality constraint for a VariableBlock and a SimpleMatrix.
247   *
248   * @param lhs Left-hand side.
249   * @param rhs Right-hand side.
250   * @return Equality constraints.
251   */
252  public static EqualityConstraints eq(VariableBlock lhs, SimpleMatrix rhs) {
253    return eq(new VariableMatrix(lhs), new VariableMatrix(rhs));
254  }
255
256  /**
257   * Equality operator that returns an equality constraint for a VariableMatrix and a double array.
258   *
259   * @param lhs Left-hand side.
260   * @param rhs Right-hand side.
261   * @return Equality constraints.
262   */
263  public static EqualityConstraints eq(VariableMatrix lhs, double[][] rhs) {
264    return eq(lhs, new VariableMatrix(rhs));
265  }
266
267  /**
268   * Equality operator that returns an equality constraint for a VariableMatrix and a SimpleMatrix.
269   *
270   * @param lhs Left-hand side.
271   * @param rhs Right-hand side.
272   * @return Equality constraints.
273   */
274  public static EqualityConstraints eq(VariableMatrix lhs, SimpleMatrix rhs) {
275    return eq(lhs, new VariableMatrix(rhs));
276  }
277
278  /**
279   * Equality operator that returns an equality constraint for two VariableMatrices.
280   *
281   * @param lhs Left-hand side.
282   * @param rhs Right-hand side.
283   * @return Equality constraints.
284   */
285  public static EqualityConstraints eq(VariableMatrix lhs, VariableMatrix rhs) {
286    assert lhs.rows() == rhs.rows() && lhs.cols() == rhs.cols();
287
288    var constraints = new ArrayList<Variable>(lhs.rows() * lhs.cols());
289    for (int row = 0; row < lhs.rows(); ++row) {
290      for (int col = 0; col < lhs.cols(); ++col) {
291        constraints.add(lhs.get(row, col).minus(rhs.get(row, col)));
292      }
293    }
294
295    var array = new Variable[constraints.size()];
296    return new EqualityConstraints(constraints.toArray(array));
297  }
298
299  // <
300
301  /**
302   * Less-than comparison operator that returns an inequality constraint for a double and a
303   * Variable.
304   *
305   * @param lhs Left-hand side.
306   * @param rhs Right-hand side.
307   * @return Inequality constraints.
308   */
309  public static InequalityConstraints lt(double lhs, Variable rhs) {
310    return ge(rhs, new Variable(lhs));
311  }
312
313  /**
314   * Less-than comparison operator that returns an inequality constraint for a Variable and a
315   * double.
316   *
317   * @param lhs Left-hand side.
318   * @param rhs Right-hand side.
319   * @return Inequality constraints.
320   */
321  public static InequalityConstraints lt(Variable lhs, double rhs) {
322    return ge(new Variable(rhs), lhs);
323  }
324
325  /**
326   * Less-than comparison operator that returns an inequality constraint for two Variables.
327   *
328   * @param lhs Left-hand side.
329   * @param rhs Right-hand side.
330   * @return Inequality constraints.
331   */
332  public static InequalityConstraints lt(Variable lhs, Variable rhs) {
333    return ge(rhs, lhs);
334  }
335
336  /**
337   * Less-than comparison operator that returns an inequality constraint for a double and a
338   * VariableBlock.
339   *
340   * @param lhs Left-hand side.
341   * @param rhs Right-hand side.
342   * @return Inequality constraints.
343   */
344  public static InequalityConstraints lt(double lhs, VariableBlock rhs) {
345    return ge(new VariableMatrix(rhs), new Variable(lhs));
346  }
347
348  /**
349   * Less-than comparison operator that returns an inequality constraint for a Variable and a
350   * VariableBlock.
351   *
352   * @param lhs Left-hand side.
353   * @param rhs Right-hand side.
354   * @return Inequality constraints.
355   */
356  public static InequalityConstraints lt(Variable lhs, VariableBlock rhs) {
357    return ge(new VariableMatrix(rhs), lhs);
358  }
359
360  /**
361   * Less-than comparison operator that returns an inequality constraint for a double and a
362   * VariableMatrix.
363   *
364   * @param lhs Left-hand side.
365   * @param rhs Right-hand side.
366   * @return Inequality constraints.
367   */
368  public static InequalityConstraints lt(double lhs, VariableMatrix rhs) {
369    return ge(rhs, new Variable(lhs));
370  }
371
372  /**
373   * Less-than comparison operator that returns an inequality constraint for a Variable and a
374   * VariableMatrix.
375   *
376   * @param lhs Left-hand side.
377   * @param rhs Right-hand side.
378   * @return Inequality constraints.
379   */
380  public static InequalityConstraints lt(Variable lhs, VariableMatrix rhs) {
381    return ge(rhs, lhs);
382  }
383
384  /**
385   * Less-than comparison operator that returns an inequality constraint for a VariableBlock and a
386   * double.
387   *
388   * @param lhs Left-hand side.
389   * @param rhs Right-hand side.
390   * @return Inequality constraints.
391   */
392  public static InequalityConstraints lt(VariableBlock lhs, double rhs) {
393    return ge(new Variable(rhs), new VariableMatrix(lhs));
394  }
395
396  /**
397   * Less-than comparison operator that returns an inequality constraint for a VariableBlock and a
398   * Variable.
399   *
400   * @param lhs Left-hand side.
401   * @param rhs Right-hand side.
402   * @return Inequality constraints.
403   */
404  public static InequalityConstraints lt(VariableBlock lhs, Variable rhs) {
405    return ge(rhs, new VariableMatrix(lhs));
406  }
407
408  /**
409   * Less-than comparison operator that returns an inequality constraint for a VariableMatrix and a
410   * double.
411   *
412   * @param lhs Left-hand side.
413   * @param rhs Right-hand side.
414   * @return Inequality constraints.
415   */
416  public static InequalityConstraints lt(VariableMatrix lhs, double rhs) {
417    return ge(new Variable(rhs), lhs);
418  }
419
420  /**
421   * Less-than comparison operator that returns an inequality constraint for a VariableMatrix and a
422   * Variable.
423   *
424   * @param lhs Left-hand side.
425   * @param rhs Right-hand side.
426   * @return Inequality constraints.
427   */
428  public static InequalityConstraints lt(VariableMatrix lhs, Variable rhs) {
429    return ge(rhs, lhs);
430  }
431
432  /**
433   * Less-than comparison operator that returns an inequality constraint for two VariableBlocks.
434   *
435   * @param lhs Left-hand side.
436   * @param rhs Right-hand side.
437   * @return Inequality constraints.
438   */
439  public static InequalityConstraints lt(VariableBlock lhs, VariableBlock rhs) {
440    return ge(new VariableMatrix(rhs), new VariableMatrix(lhs));
441  }
442
443  /**
444   * Less-than comparison operator that returns an inequality constraint for a VariableBlock and a
445   * VariableMatrix.
446   *
447   * @param lhs Left-hand side.
448   * @param rhs Right-hand side.
449   * @return Inequality constraints.
450   */
451  public static InequalityConstraints lt(VariableBlock lhs, VariableMatrix rhs) {
452    return ge(rhs, new VariableMatrix(lhs));
453  }
454
455  /**
456   * Less-than comparison operator that returns an inequality constraint for a VariableMatrix and a
457   * VariableBlock.
458   *
459   * @param lhs Left-hand side.
460   * @param rhs Right-hand side.
461   * @return Inequality constraints.
462   */
463  public static InequalityConstraints lt(VariableMatrix lhs, VariableBlock rhs) {
464    return ge(new VariableMatrix(rhs), lhs);
465  }
466
467  /**
468   * Less-than comparison operator that returns an inequality constraint for a double array and a
469   * VariableBlock.
470   *
471   * @param lhs Left-hand side.
472   * @param rhs Right-hand side.
473   * @return Equality constraints.
474   */
475  public static InequalityConstraints lt(double[][] lhs, VariableBlock rhs) {
476    return lt(new VariableMatrix(lhs), new VariableMatrix(rhs));
477  }
478
479  /**
480   * Less-than comparison operator that returns an inequality constraint for a SimpleMatrix and a
481   * VariableBlock.
482   *
483   * @param lhs Left-hand side.
484   * @param rhs Right-hand side.
485   * @return Equality constraints.
486   */
487  public static InequalityConstraints lt(SimpleMatrix lhs, VariableBlock rhs) {
488    return lt(new VariableMatrix(lhs), new VariableMatrix(rhs));
489  }
490
491  /**
492   * Less-than comparison operator that returns an inequality constraint for a double array and a
493   * VariableMatrix.
494   *
495   * @param lhs Left-hand side.
496   * @param rhs Right-hand side.
497   * @return Equality constraints.
498   */
499  public static InequalityConstraints lt(double[][] lhs, VariableMatrix rhs) {
500    return lt(new VariableMatrix(lhs), rhs);
501  }
502
503  /**
504   * Less-than comparison operator that returns an inequality constraint for a SimpleMatrix and a
505   * VariableMatrix.
506   *
507   * @param lhs Left-hand side.
508   * @param rhs Right-hand side.
509   * @return Equality constraints.
510   */
511  public static InequalityConstraints lt(SimpleMatrix lhs, VariableMatrix rhs) {
512    return lt(new VariableMatrix(lhs), rhs);
513  }
514
515  /**
516   * Less-than comparison operator that returns an inequality constraint for a VariableBlock and a
517   * double array.
518   *
519   * @param lhs Left-hand side.
520   * @param rhs Right-hand side.
521   * @return Equality constraints.
522   */
523  public static InequalityConstraints lt(VariableBlock lhs, double[][] rhs) {
524    return lt(new VariableMatrix(lhs), new VariableMatrix(rhs));
525  }
526
527  /**
528   * Less-than comparison operator that returns an inequality constraint for a VariableBlock and a
529   * SimpleMatrix.
530   *
531   * @param lhs Left-hand side.
532   * @param rhs Right-hand side.
533   * @return Equality constraints.
534   */
535  public static InequalityConstraints lt(VariableBlock lhs, SimpleMatrix rhs) {
536    return lt(new VariableMatrix(lhs), new VariableMatrix(rhs));
537  }
538
539  /**
540   * Less-than comparison operator that returns an inequality constraint for a VariableMatrix and a
541   * double array.
542   *
543   * @param lhs Left-hand side.
544   * @param rhs Right-hand side.
545   * @return Equality constraints.
546   */
547  public static InequalityConstraints lt(VariableMatrix lhs, double[][] rhs) {
548    return lt(lhs, new VariableMatrix(rhs));
549  }
550
551  /**
552   * Less-than comparison operator that returns an inequality constraint for a VariableMatrix and a
553   * SimpleMatrix.
554   *
555   * @param lhs Left-hand side.
556   * @param rhs Right-hand side.
557   * @return Equality constraints.
558   */
559  public static InequalityConstraints lt(VariableMatrix lhs, SimpleMatrix rhs) {
560    return lt(lhs, new VariableMatrix(rhs));
561  }
562
563  /**
564   * Less-than comparison operator that returns an inequality constraint for two VariableMatrices.
565   *
566   * @param lhs Left-hand side.
567   * @param rhs Right-hand side.
568   * @return Inequality constraints.
569   */
570  public static InequalityConstraints lt(VariableMatrix lhs, VariableMatrix rhs) {
571    return ge(rhs, lhs);
572  }
573
574  // <=
575
576  /**
577   * Less-than-or-equal-to comparison operator that returns an inequality constraint for a double
578   * and a Variable.
579   *
580   * @param lhs Left-hand side.
581   * @param rhs Right-hand side.
582   * @return Inequality constraints.
583   */
584  public static InequalityConstraints le(double lhs, Variable rhs) {
585    return ge(rhs, new Variable(lhs));
586  }
587
588  /**
589   * Less-than-or-equal-to comparison operator that returns an inequality constraint for a Variable
590   * and a double.
591   *
592   * @param lhs Left-hand side.
593   * @param rhs Right-hand side.
594   * @return Inequality constraints.
595   */
596  public static InequalityConstraints le(Variable lhs, double rhs) {
597    return ge(new Variable(rhs), lhs);
598  }
599
600  /**
601   * Less-than-or-equal-to comparison operator that returns an inequality constraint for two
602   * Variables.
603   *
604   * @param lhs Left-hand side.
605   * @param rhs Right-hand side.
606   * @return Inequality constraints.
607   */
608  public static InequalityConstraints le(Variable lhs, Variable rhs) {
609    return ge(rhs, lhs);
610  }
611
612  /**
613   * Less-than-or-equal-to comparison operator that returns an inequality constraint for a double
614   * and a VariableBlock.
615   *
616   * @param lhs Left-hand side.
617   * @param rhs Right-hand side.
618   * @return Inequality constraints.
619   */
620  public static InequalityConstraints le(double lhs, VariableBlock rhs) {
621    return ge(new VariableMatrix(rhs), new Variable(lhs));
622  }
623
624  /**
625   * Less-than-or-equal-to comparison operator that returns an inequality constraint for a Variable
626   * and a VariableBlock.
627   *
628   * @param lhs Left-hand side.
629   * @param rhs Right-hand side.
630   * @return Inequality constraints.
631   */
632  public static InequalityConstraints le(Variable lhs, VariableBlock rhs) {
633    return ge(new VariableMatrix(rhs), lhs);
634  }
635
636  /**
637   * Less-than-or-equal-to comparison operator that returns an inequality constraint for a double
638   * and a VariableMatrix.
639   *
640   * @param lhs Left-hand side.
641   * @param rhs Right-hand side.
642   * @return Inequality constraints.
643   */
644  public static InequalityConstraints le(double lhs, VariableMatrix rhs) {
645    return ge(rhs, new Variable(lhs));
646  }
647
648  /**
649   * Less-than-or-equal-to comparison operator that returns an inequality constraint for a Variable
650   * and a VariableMatrix.
651   *
652   * @param lhs Left-hand side.
653   * @param rhs Right-hand side.
654   * @return Inequality constraints.
655   */
656  public static InequalityConstraints le(Variable lhs, VariableMatrix rhs) {
657    return ge(rhs, lhs);
658  }
659
660  /**
661   * Less-than-or-equal-to comparison operator that returns an inequality constraint for a
662   * VariableBlock and a double.
663   *
664   * @param lhs Left-hand side.
665   * @param rhs Right-hand side.
666   * @return Inequality constraints.
667   */
668  public static InequalityConstraints le(VariableBlock lhs, double rhs) {
669    return ge(new Variable(rhs), new VariableMatrix(lhs));
670  }
671
672  /**
673   * Less-than-or-equal-to comparison operator that returns an inequality constraint for a
674   * VariableBlock and a Variable.
675   *
676   * @param lhs Left-hand side.
677   * @param rhs Right-hand side.
678   * @return Inequality constraints.
679   */
680  public static InequalityConstraints le(VariableBlock lhs, Variable rhs) {
681    return ge(rhs, new VariableMatrix(lhs));
682  }
683
684  /**
685   * Less-than-or-equal-to comparison operator that returns an inequality constraint for a
686   * VariableMatrix and a double.
687   *
688   * @param lhs Left-hand side.
689   * @param rhs Right-hand side.
690   * @return Inequality constraints.
691   */
692  public static InequalityConstraints le(VariableMatrix lhs, double rhs) {
693    return ge(new Variable(rhs), lhs);
694  }
695
696  /**
697   * Less-than-or-equal-to comparison operator that returns an inequality constraint for a
698   * VariableMatrix and a Variable.
699   *
700   * @param lhs Left-hand side.
701   * @param rhs Right-hand side.
702   * @return Inequality constraints.
703   */
704  public static InequalityConstraints le(VariableMatrix lhs, Variable rhs) {
705    return ge(rhs, lhs);
706  }
707
708  /**
709   * Less-than-or-equal-to comparison operator that returns an inequality constraint for two
710   * VariableBlocks.
711   *
712   * @param lhs Left-hand side.
713   * @param rhs Right-hand side.
714   * @return Inequality constraints.
715   */
716  public static InequalityConstraints le(VariableBlock lhs, VariableBlock rhs) {
717    return ge(new VariableMatrix(rhs), new VariableMatrix(lhs));
718  }
719
720  /**
721   * Less-than-or-equal-to comparison operator that returns an inequality constraint for a
722   * VariableBlock and a VariableMatrix.
723   *
724   * @param lhs Left-hand side.
725   * @param rhs Right-hand side.
726   * @return Inequality constraints.
727   */
728  public static InequalityConstraints le(VariableBlock lhs, VariableMatrix rhs) {
729    return ge(rhs, new VariableMatrix(lhs));
730  }
731
732  /**
733   * Less-than-or-equal-to comparison operator that returns an inequality constraint for a
734   * VariableMatrix and a VariableBlock.
735   *
736   * @param lhs Left-hand side.
737   * @param rhs Right-hand side.
738   * @return Inequality constraints.
739   */
740  public static InequalityConstraints le(VariableMatrix lhs, VariableBlock rhs) {
741    return ge(new VariableMatrix(rhs), lhs);
742  }
743
744  /**
745   * Less-than-or-equal-to comparison operator that returns an inequality constraint for a double
746   * array and a VariableBlock.
747   *
748   * @param lhs Left-hand side.
749   * @param rhs Right-hand side.
750   * @return Equality constraints.
751   */
752  public static InequalityConstraints le(double[][] lhs, VariableBlock rhs) {
753    return le(new VariableMatrix(lhs), new VariableMatrix(rhs));
754  }
755
756  /**
757   * Less-than-or-equal-to comparison operator that returns an inequality constraint for a
758   * SimpleMatrix and a VariableBlock.
759   *
760   * @param lhs Left-hand side.
761   * @param rhs Right-hand side.
762   * @return Equality constraints.
763   */
764  public static InequalityConstraints le(SimpleMatrix lhs, VariableBlock rhs) {
765    return le(new VariableMatrix(lhs), new VariableMatrix(rhs));
766  }
767
768  /**
769   * Less-than-or-equal-to comparison operator that returns an inequality constraint for a double
770   * array and a VariableMatrix.
771   *
772   * @param lhs Left-hand side.
773   * @param rhs Right-hand side.
774   * @return Equality constraints.
775   */
776  public static InequalityConstraints le(double[][] lhs, VariableMatrix rhs) {
777    return le(new VariableMatrix(lhs), rhs);
778  }
779
780  /**
781   * Less-than-or-equal-to comparison operator that returns an inequality constraint for a
782   * SimpleMatrix and a VariableMatrix.
783   *
784   * @param lhs Left-hand side.
785   * @param rhs Right-hand side.
786   * @return Equality constraints.
787   */
788  public static InequalityConstraints le(SimpleMatrix lhs, VariableMatrix rhs) {
789    return le(new VariableMatrix(lhs), rhs);
790  }
791
792  /**
793   * Less-than-or-equal-to comparison operator that returns an inequality constraint for a
794   * VariableBlock and a double array.
795   *
796   * @param lhs Left-hand side.
797   * @param rhs Right-hand side.
798   * @return Equality constraints.
799   */
800  public static InequalityConstraints le(VariableBlock lhs, double[][] rhs) {
801    return le(new VariableMatrix(lhs), new VariableMatrix(rhs));
802  }
803
804  /**
805   * Less-than-or-equal-to comparison operator that returns an inequality constraint for a
806   * VariableBlock and a SimpleMatrix.
807   *
808   * @param lhs Left-hand side.
809   * @param rhs Right-hand side.
810   * @return Equality constraints.
811   */
812  public static InequalityConstraints le(VariableBlock lhs, SimpleMatrix rhs) {
813    return le(new VariableMatrix(lhs), new VariableMatrix(rhs));
814  }
815
816  /**
817   * Less-than-or-equal-to comparison operator that returns an inequality constraint for a
818   * VariableMatrix and a double array.
819   *
820   * @param lhs Left-hand side.
821   * @param rhs Right-hand side.
822   * @return Equality constraints.
823   */
824  public static InequalityConstraints le(VariableMatrix lhs, double[][] rhs) {
825    return le(lhs, new VariableMatrix(rhs));
826  }
827
828  /**
829   * Less-than-or-equal-to comparison operator that returns an inequality constraint for a
830   * VariableMatrix and a SimpleMatrix.
831   *
832   * @param lhs Left-hand side.
833   * @param rhs Right-hand side.
834   * @return Equality constraints.
835   */
836  public static InequalityConstraints le(VariableMatrix lhs, SimpleMatrix rhs) {
837    return le(lhs, new VariableMatrix(rhs));
838  }
839
840  /**
841   * Less-than-or-equal-to comparison operator that returns an inequality constraint for two
842   * VariableMatrices.
843   *
844   * @param lhs Left-hand side.
845   * @param rhs Right-hand side.
846   * @return Inequality constraints.
847   */
848  public static InequalityConstraints le(VariableMatrix lhs, VariableMatrix rhs) {
849    return ge(rhs, lhs);
850  }
851
852  // >
853
854  /**
855   * Greater-than comparison operator that returns an inequality constraint for a double and a
856   * Variable.
857   *
858   * @param lhs Left-hand side.
859   * @param rhs Right-hand side.
860   * @return Inequality constraints.
861   */
862  public static InequalityConstraints gt(double lhs, Variable rhs) {
863    return ge(new Variable(lhs), rhs);
864  }
865
866  /**
867   * Greater-than comparison operator that returns an inequality constraint for a Variable and a
868   * double.
869   *
870   * @param lhs Left-hand side.
871   * @param rhs Right-hand side.
872   * @return Inequality constraints.
873   */
874  public static InequalityConstraints gt(Variable lhs, double rhs) {
875    return ge(lhs, new Variable(rhs));
876  }
877
878  /**
879   * Greater-than comparison operator that returns an inequality constraint for two Variables.
880   *
881   * @param lhs Left-hand side.
882   * @param rhs Right-hand side.
883   * @return Inequality constraints.
884   */
885  public static InequalityConstraints gt(Variable lhs, Variable rhs) {
886    return ge(lhs, rhs);
887  }
888
889  /**
890   * Greater-than comparison operator that returns an inequality constraint for a double and a
891   * VariableBlock.
892   *
893   * @param lhs Left-hand side.
894   * @param rhs Right-hand side.
895   * @return Inequality constraints.
896   */
897  public static InequalityConstraints gt(double lhs, VariableBlock rhs) {
898    return ge(new Variable(lhs), new VariableMatrix(rhs));
899  }
900
901  /**
902   * Greater-than comparison operator that returns an inequality constraint for a Variable and a
903   * VariableBlock.
904   *
905   * @param lhs Left-hand side.
906   * @param rhs Right-hand side.
907   * @return Inequality constraints.
908   */
909  public static InequalityConstraints gt(Variable lhs, VariableBlock rhs) {
910    return ge(lhs, new VariableMatrix(rhs));
911  }
912
913  /**
914   * Greater-than comparison operator that returns an inequality constraint for a double and a
915   * VariableMatrix.
916   *
917   * @param lhs Left-hand side.
918   * @param rhs Right-hand side.
919   * @return Inequality constraints.
920   */
921  public static InequalityConstraints gt(double lhs, VariableMatrix rhs) {
922    return ge(new Variable(lhs), rhs);
923  }
924
925  /**
926   * Greater-than comparison operator that returns an inequality constraint for a Variable and a
927   * VariableMatrix.
928   *
929   * @param lhs Left-hand side.
930   * @param rhs Right-hand side.
931   * @return Inequality constraints.
932   */
933  public static InequalityConstraints gt(Variable lhs, VariableMatrix rhs) {
934    return ge(lhs, rhs);
935  }
936
937  /**
938   * Greater-than comparison operator that returns an inequality constraint for a VariableBlock and
939   * a double.
940   *
941   * @param lhs Left-hand side.
942   * @param rhs Right-hand side.
943   * @return Inequality constraints.
944   */
945  public static InequalityConstraints gt(VariableBlock lhs, double rhs) {
946    return ge(new VariableMatrix(lhs), new Variable(rhs));
947  }
948
949  /**
950   * Greater-than comparison operator that returns an inequality constraint for a VariableBlock and
951   * a Variable.
952   *
953   * @param lhs Left-hand side.
954   * @param rhs Right-hand side.
955   * @return Inequality constraints.
956   */
957  public static InequalityConstraints gt(VariableBlock lhs, Variable rhs) {
958    return ge(new VariableMatrix(lhs), rhs);
959  }
960
961  /**
962   * Greater-than comparison operator that returns an inequality constraint for a VariableMatrix and
963   * a double.
964   *
965   * @param lhs Left-hand side.
966   * @param rhs Right-hand side.
967   * @return Inequality constraints.
968   */
969  public static InequalityConstraints gt(VariableMatrix lhs, double rhs) {
970    return ge(lhs, new Variable(rhs));
971  }
972
973  /**
974   * Greater-than comparison operator that returns an inequality constraint for a VariableMatrix and
975   * a Variable.
976   *
977   * @param lhs Left-hand side.
978   * @param rhs Right-hand side.
979   * @return Inequality constraints.
980   */
981  public static InequalityConstraints gt(VariableMatrix lhs, Variable rhs) {
982    return ge(lhs, rhs);
983  }
984
985  /**
986   * Greater-than comparison operator that returns an inequality constraint for two VariableBlocks.
987   *
988   * @param lhs Left-hand side.
989   * @param rhs Right-hand side.
990   * @return Inequality constraints.
991   */
992  public static InequalityConstraints gt(VariableBlock lhs, VariableBlock rhs) {
993    return ge(new VariableMatrix(lhs), new VariableMatrix(rhs));
994  }
995
996  /**
997   * Greater-than comparison operator that returns an inequality constraint for a VariableBlock and
998   * a VariableMatrix.
999   *
1000   * @param lhs Left-hand side.
1001   * @param rhs Right-hand side.
1002   * @return Inequality constraints.
1003   */
1004  public static InequalityConstraints gt(VariableBlock lhs, VariableMatrix rhs) {
1005    return ge(new VariableMatrix(lhs), rhs);
1006  }
1007
1008  /**
1009   * Greater-than comparison operator that returns an inequality constraint for a VariableMatrix and
1010   * a VariableBlock.
1011   *
1012   * @param lhs Left-hand side.
1013   * @param rhs Right-hand side.
1014   * @return Inequality constraints.
1015   */
1016  public static InequalityConstraints gt(VariableMatrix lhs, VariableBlock rhs) {
1017    return ge(lhs, new VariableMatrix(rhs));
1018  }
1019
1020  /**
1021   * Greater-than comparison operator that returns an inequality constraint for a double array and a
1022   * VariableBlock.
1023   *
1024   * @param lhs Left-hand side.
1025   * @param rhs Right-hand side.
1026   * @return Equality constraints.
1027   */
1028  public static InequalityConstraints gt(double[][] lhs, VariableBlock rhs) {
1029    return gt(new VariableMatrix(lhs), new VariableMatrix(rhs));
1030  }
1031
1032  /**
1033   * Greater-than comparison operator that returns an inequality constraint for a SimpleMatrix and a
1034   * VariableBlock.
1035   *
1036   * @param lhs Left-hand side.
1037   * @param rhs Right-hand side.
1038   * @return Equality constraints.
1039   */
1040  public static InequalityConstraints gt(SimpleMatrix lhs, VariableBlock rhs) {
1041    return gt(new VariableMatrix(lhs), new VariableMatrix(rhs));
1042  }
1043
1044  /**
1045   * Greater-than comparison operator that returns an inequality constraint for a double array and a
1046   * VariableMatrix.
1047   *
1048   * @param lhs Left-hand side.
1049   * @param rhs Right-hand side.
1050   * @return Equality constraints.
1051   */
1052  public static InequalityConstraints gt(double[][] lhs, VariableMatrix rhs) {
1053    return gt(new VariableMatrix(lhs), rhs);
1054  }
1055
1056  /**
1057   * Greater-than comparison operator that returns an inequality constraint for a SimpleMatrix and a
1058   * VariableMatrix.
1059   *
1060   * @param lhs Left-hand side.
1061   * @param rhs Right-hand side.
1062   * @return Equality constraints.
1063   */
1064  public static InequalityConstraints gt(SimpleMatrix lhs, VariableMatrix rhs) {
1065    return gt(new VariableMatrix(lhs), rhs);
1066  }
1067
1068  /**
1069   * Greater-than comparison operator that returns an inequality constraint for a VariableBlock and
1070   * a double array.
1071   *
1072   * @param lhs Left-hand side.
1073   * @param rhs Right-hand side.
1074   * @return Equality constraints.
1075   */
1076  public static InequalityConstraints gt(VariableBlock lhs, double[][] rhs) {
1077    return gt(new VariableMatrix(lhs), new VariableMatrix(rhs));
1078  }
1079
1080  /**
1081   * Greater-than comparison operator that returns an inequality constraint for a VariableBlock and
1082   * a SimpleMatrix.
1083   *
1084   * @param lhs Left-hand side.
1085   * @param rhs Right-hand side.
1086   * @return Equality constraints.
1087   */
1088  public static InequalityConstraints gt(VariableBlock lhs, SimpleMatrix rhs) {
1089    return gt(new VariableMatrix(lhs), new VariableMatrix(rhs));
1090  }
1091
1092  /**
1093   * Greater-than comparison operator that returns an inequality constraint for a VariableMatrix and
1094   * a double array.
1095   *
1096   * @param lhs Left-hand side.
1097   * @param rhs Right-hand side.
1098   * @return Equality constraints.
1099   */
1100  public static InequalityConstraints gt(VariableMatrix lhs, double[][] rhs) {
1101    return gt(lhs, new VariableMatrix(rhs));
1102  }
1103
1104  /**
1105   * Greater-than comparison operator that returns an inequality constraint for a VariableMatrix and
1106   * a SimpleMatrix.
1107   *
1108   * @param lhs Left-hand side.
1109   * @param rhs Right-hand side.
1110   * @return Equality constraints.
1111   */
1112  public static InequalityConstraints gt(VariableMatrix lhs, SimpleMatrix rhs) {
1113    return gt(lhs, new VariableMatrix(rhs));
1114  }
1115
1116  /**
1117   * Greater-than comparison operator that returns an inequality constraint for two
1118   * VariableMatrices.
1119   *
1120   * @param lhs Left-hand side.
1121   * @param rhs Right-hand side.
1122   * @return Inequality constraints.
1123   */
1124  public static InequalityConstraints gt(VariableMatrix lhs, VariableMatrix rhs) {
1125    return ge(lhs, rhs);
1126  }
1127
1128  // >=
1129
1130  /**
1131   * Greater-than-or-equal-to comparison operator that returns an inequality constraint for a double
1132   * and a Variable.
1133   *
1134   * @param lhs Left-hand side.
1135   * @param rhs Right-hand side.
1136   * @return Inequality constraints.
1137   */
1138  public static InequalityConstraints ge(double lhs, Variable rhs) {
1139    return ge(new Variable(lhs), rhs);
1140  }
1141
1142  /**
1143   * Greater-than-or-equal-to comparison operator that returns an inequality constraint for a
1144   * Variable and a double.
1145   *
1146   * @param lhs Left-hand side.
1147   * @param rhs Right-hand side.
1148   * @return Inequality constraints.
1149   */
1150  public static InequalityConstraints ge(Variable lhs, double rhs) {
1151    return ge(lhs, new Variable(rhs));
1152  }
1153
1154  /**
1155   * Greater-than-or-equal-to comparison operator that returns an inequality constraint for two
1156   * Variables.
1157   *
1158   * @param lhs Left-hand side.
1159   * @param rhs Right-hand side.
1160   * @return Inequality constraints.
1161   */
1162  public static InequalityConstraints ge(Variable lhs, Variable rhs) {
1163    return new InequalityConstraints(new Variable[] {lhs.minus(rhs)});
1164  }
1165
1166  /**
1167   * Greater-than-or-equal-to comparison operator that returns an inequality constraint for a double
1168   * and a VariableBlock.
1169   *
1170   * @param lhs Left-hand side.
1171   * @param rhs Right-hand side.
1172   * @return Inequality constraints.
1173   */
1174  public static InequalityConstraints ge(double lhs, VariableBlock rhs) {
1175    return ge(new Variable(lhs), new VariableMatrix(rhs));
1176  }
1177
1178  /**
1179   * Greater-than-or-equal-to comparison operator that returns an inequality constraint for a
1180   * Variable and a VariableBlock.
1181   *
1182   * @param lhs Left-hand side.
1183   * @param rhs Right-hand side.
1184   * @return Inequality constraints.
1185   */
1186  public static InequalityConstraints ge(Variable lhs, VariableBlock rhs) {
1187    return ge(lhs, new VariableMatrix(rhs));
1188  }
1189
1190  /**
1191   * Greater-than-or-equal-to comparison operator that returns an inequality constraint for a double
1192   * and a VariableMatrix.
1193   *
1194   * @param lhs Left-hand side.
1195   * @param rhs Right-hand side.
1196   * @return Inequality constraints.
1197   */
1198  public static InequalityConstraints ge(double lhs, VariableMatrix rhs) {
1199    return ge(new Variable(lhs), rhs);
1200  }
1201
1202  /**
1203   * Greater-than-or-equal-to comparison operator that returns an inequality constraint for a
1204   * Variable and a VariableMatrix.
1205   *
1206   * @param lhs Left-hand side.
1207   * @param rhs Right-hand side.
1208   * @return Inequality constraints.
1209   */
1210  public static InequalityConstraints ge(Variable lhs, VariableMatrix rhs) {
1211    var constraints = new ArrayList<Variable>(rhs.rows() * rhs.cols());
1212    for (int row = 0; row < rhs.rows(); ++row) {
1213      for (int col = 0; col < rhs.cols(); ++col) {
1214        constraints.add(lhs.minus(rhs.get(row, col)));
1215      }
1216    }
1217
1218    var array = new Variable[constraints.size()];
1219    return new InequalityConstraints(constraints.toArray(array));
1220  }
1221
1222  /**
1223   * Greater-than-or-equal-to comparison operator that returns an inequality constraint for a
1224   * VariableBlock and a double.
1225   *
1226   * @param lhs Left-hand side.
1227   * @param rhs Right-hand side.
1228   * @return Inequality constraints.
1229   */
1230  public static InequalityConstraints ge(VariableBlock lhs, double rhs) {
1231    return ge(new VariableMatrix(lhs), new Variable(rhs));
1232  }
1233
1234  /**
1235   * Greater-than-or-equal-to comparison operator that returns an inequality constraint for a
1236   * VariableBlock and a Variable.
1237   *
1238   * @param lhs Left-hand side.
1239   * @param rhs Right-hand side.
1240   * @return Inequality constraints.
1241   */
1242  public static InequalityConstraints ge(VariableBlock lhs, Variable rhs) {
1243    return ge(new VariableMatrix(lhs), rhs);
1244  }
1245
1246  /**
1247   * Greater-than-or-equal-to comparison operator that returns an inequality constraint for a
1248   * VariableMatrix and a double.
1249   *
1250   * @param lhs Left-hand side.
1251   * @param rhs Right-hand side.
1252   * @return Inequality constraints.
1253   */
1254  public static InequalityConstraints ge(VariableMatrix lhs, double rhs) {
1255    return ge(lhs, new Variable(rhs));
1256  }
1257
1258  /**
1259   * Greater-than-or-equal-to comparison operator that returns an inequality constraint for a
1260   * VariableMatrix and a Variable.
1261   *
1262   * @param lhs Left-hand side.
1263   * @param rhs Right-hand side.
1264   * @return Inequality constraints.
1265   */
1266  public static InequalityConstraints ge(VariableMatrix lhs, Variable rhs) {
1267    var constraints = new ArrayList<Variable>(lhs.rows() * lhs.cols());
1268    for (int row = 0; row < lhs.rows(); ++row) {
1269      for (int col = 0; col < lhs.cols(); ++col) {
1270        constraints.add(lhs.get(row, col).minus(rhs));
1271      }
1272    }
1273
1274    var array = new Variable[constraints.size()];
1275    return new InequalityConstraints(constraints.toArray(array));
1276  }
1277
1278  /**
1279   * Greater-than-or-equal-to comparison operator that returns an inequality constraint for two
1280   * VariableBlocks.
1281   *
1282   * @param lhs Left-hand side.
1283   * @param rhs Right-hand side.
1284   * @return Inequality constraints.
1285   */
1286  public static InequalityConstraints ge(VariableBlock lhs, VariableBlock rhs) {
1287    return ge(new VariableMatrix(lhs), new VariableMatrix(rhs));
1288  }
1289
1290  /**
1291   * Greater-than-or-equal-to comparison operator that returns an inequality constraint for a
1292   * VariableBlock and a VariableMatrix.
1293   *
1294   * @param lhs Left-hand side.
1295   * @param rhs Right-hand side.
1296   * @return Inequality constraints.
1297   */
1298  public static InequalityConstraints ge(VariableBlock lhs, VariableMatrix rhs) {
1299    return ge(new VariableMatrix(lhs), rhs);
1300  }
1301
1302  /**
1303   * Greater-than-or-equal-to comparison operator that returns an inequality constraint for a
1304   * VariableMatrix and a VariableBlock.
1305   *
1306   * @param lhs Left-hand side.
1307   * @param rhs Right-hand side.
1308   * @return Inequality constraints.
1309   */
1310  public static InequalityConstraints ge(VariableMatrix lhs, VariableBlock rhs) {
1311    return ge(lhs, new VariableMatrix(rhs));
1312  }
1313
1314  /**
1315   * Greater-than-or-equal-to comparison operator that returns an inequality constraint for a double
1316   * array and a VariableBlock.
1317   *
1318   * @param lhs Left-hand side.
1319   * @param rhs Right-hand side.
1320   * @return Equality constraints.
1321   */
1322  public static InequalityConstraints ge(double[][] lhs, VariableBlock rhs) {
1323    return ge(new VariableMatrix(lhs), new VariableMatrix(rhs));
1324  }
1325
1326  /**
1327   * Greater-than-or-equal-to comparison operator that returns an inequality constraint for a
1328   * SimpleMatrix and a VariableBlock.
1329   *
1330   * @param lhs Left-hand side.
1331   * @param rhs Right-hand side.
1332   * @return Equality constraints.
1333   */
1334  public static InequalityConstraints ge(SimpleMatrix lhs, VariableBlock rhs) {
1335    return ge(new VariableMatrix(lhs), new VariableMatrix(rhs));
1336  }
1337
1338  /**
1339   * Greater-than-or-equal-to comparison operator that returns an inequality constraint for a double
1340   * array and a VariableMatrix.
1341   *
1342   * @param lhs Left-hand side.
1343   * @param rhs Right-hand side.
1344   * @return Equality constraints.
1345   */
1346  public static InequalityConstraints ge(double[][] lhs, VariableMatrix rhs) {
1347    return ge(new VariableMatrix(lhs), rhs);
1348  }
1349
1350  /**
1351   * Greater-than-or-equal-to comparison operator that returns an inequality constraint for a
1352   * SimpleMatrix and a VariableMatrix.
1353   *
1354   * @param lhs Left-hand side.
1355   * @param rhs Right-hand side.
1356   * @return Equality constraints.
1357   */
1358  public static InequalityConstraints ge(SimpleMatrix lhs, VariableMatrix rhs) {
1359    return ge(new VariableMatrix(lhs), rhs);
1360  }
1361
1362  /**
1363   * Greater-than-or-equal-to comparison operator that returns an inequality constraint for a
1364   * VariableBlock and a double array.
1365   *
1366   * @param lhs Left-hand side.
1367   * @param rhs Right-hand side.
1368   * @return Equality constraints.
1369   */
1370  public static InequalityConstraints ge(VariableBlock lhs, double[][] rhs) {
1371    return ge(new VariableMatrix(lhs), new VariableMatrix(rhs));
1372  }
1373
1374  /**
1375   * Greater-than-or-equal-to comparison operator that returns an inequality constraint for a
1376   * VariableBlock and a SimpleMatrix.
1377   *
1378   * @param lhs Left-hand side.
1379   * @param rhs Right-hand side.
1380   * @return Equality constraints.
1381   */
1382  public static InequalityConstraints ge(VariableBlock lhs, SimpleMatrix rhs) {
1383    return ge(new VariableMatrix(lhs), new VariableMatrix(rhs));
1384  }
1385
1386  /**
1387   * Greater-than-or-equal-to comparison operator that returns an inequality constraint for a
1388   * VariableMatrix and a double array.
1389   *
1390   * @param lhs Left-hand side.
1391   * @param rhs Right-hand side.
1392   * @return Equality constraints.
1393   */
1394  public static InequalityConstraints ge(VariableMatrix lhs, double[][] rhs) {
1395    return ge(lhs, new VariableMatrix(rhs));
1396  }
1397
1398  /**
1399   * Greater-than-or-equal-to comparison operator that returns an inequality constraint for a
1400   * VariableMatrix and a SimpleMatrix.
1401   *
1402   * @param lhs Left-hand side.
1403   * @param rhs Right-hand side.
1404   * @return Equality constraints.
1405   */
1406  public static InequalityConstraints ge(VariableMatrix lhs, SimpleMatrix rhs) {
1407    return ge(lhs, new VariableMatrix(rhs));
1408  }
1409
1410  /**
1411   * Greater-than-or-equal-to comparison operator that returns an inequality constraint for two
1412   * VariableMatrices.
1413   *
1414   * @param lhs Left-hand side.
1415   * @param rhs Right-hand side.
1416   * @return Inequality constraints.
1417   */
1418  public static InequalityConstraints ge(VariableMatrix lhs, VariableMatrix rhs) {
1419    assert lhs.rows() == rhs.rows() && lhs.cols() == rhs.cols();
1420
1421    var constraints = new ArrayList<Variable>(lhs.rows() * lhs.cols());
1422    for (int row = 0; row < lhs.rows(); ++row) {
1423      for (int col = 0; col < lhs.cols(); ++col) {
1424        constraints.add(lhs.get(row, col).minus(rhs.get(row, col)));
1425      }
1426    }
1427
1428    var array = new Variable[constraints.size()];
1429    return new InequalityConstraints(constraints.toArray(array));
1430  }
1431
1432  /**
1433   * Helper function for creating bound constraints.
1434   *
1435   * @param l Lower bound.
1436   * @param x Variable to bound.
1437   * @param u Upper bound.
1438   * @return Inequality constraints.
1439   */
1440  public static InequalityConstraints bounds(double l, Variable x, double u) {
1441    return bounds(l, new VariableMatrix(x), u);
1442  }
1443
1444  /**
1445   * Helper function for creating bound constraints.
1446   *
1447   * @param l Lower bound.
1448   * @param x Variable to bound.
1449   * @param u Upper bound.
1450   * @return Inequality constraints.
1451   */
1452  public static InequalityConstraints bounds(double l, VariableMatrix x, double u) {
1453    var ineq1 = le(l, x).constraints;
1454    var ineq2 = le(x, u).constraints;
1455    var result = new Variable[ineq1.length + ineq2.length];
1456    System.arraycopy(ineq1, 0, result, 0, ineq1.length);
1457    System.arraycopy(ineq2, 0, result, ineq1.length, ineq2.length);
1458    return new InequalityConstraints(result);
1459  }
1460
1461  /**
1462   * Helper function for creating bound constraints.
1463   *
1464   * @param l Lower bound.
1465   * @param x Variable to bound.
1466   * @param u Upper bound.
1467   * @return Inequality constraints.
1468   */
1469  public static InequalityConstraints bounds(double l, VariableBlock x, double u) {
1470    return bounds(l, new VariableMatrix(x), u);
1471  }
1472}