Poplar and PopLibs
ElementWise.hpp
Go to the documentation of this file.
1// Copyright (c) 2017 Graphcore Ltd. All rights reserved.
16#ifndef popops_ElementWise_hpp
17#define popops_ElementWise_hpp
18
19#include <poplar/Graph.hpp>
20#include <poplar/OptionFlags.hpp>
21#include <poplar/Program.hpp>
22#include <popops/Expr.hpp>
23#include <poputil/DebugInfo.hpp>
24#include <string>
25
26namespace poputil {
27template <>
28poplar::ProfileValue toProfileValue(const popops::expr::UnaryOpType &op);
29template <>
30poplar::ProfileValue toProfileValue(const popops::expr::BinaryOpType &op);
31template <>
33} // namespace poputil
34
35namespace popops {
36
37// Elementwise operations.
38
39/* Variance conversion operations can be created using the map functions,
40 * but that requires the input and output to be of the same type.
41 * It can be an advantage to maintain variance in full precision and
42 * inverse standard deviation in half precision. These supplementary functions
43 * make that possible.
44 */
67 const poplar::Tensor &epsilon,
69 const poplar::Type dstType = poplar::HALF,
70 const poplar::DebugContext &debugContext = {});
71
74 const float epsilon, poplar::program::Sequence &prog,
75 const poplar::Type dstType = poplar::HALF,
76 const poplar::DebugContext &debugContext = {});
100 const poplar::Tensor &epsilon,
102 const poplar::Type dstType = poplar::FLOAT,
103 const poplar::DebugContext &debugContext = {});
104
107 const float epsilon, poplar::program::Sequence &prog,
108 const poplar::Type dstType = poplar::FLOAT,
109 const poplar::DebugContext &debugContext = {});
125/*[INTERNAL]
126 * * `enableVectorBroadcastOptimisations` (true, false) [=true]
127 *
128 * This option is only applicable if `expr` is a binary operation. If true,
129 * vector broadcasts are optimised by attempting to find the most efficient
130 * way to perform the binary operation on each tile.
131 *
132 * * `forceGenerateCodelet` (true, false) [=false]
133 *
134 * Always generates codelets regardless of the expression and input
135 * tensors. Intended for testing only.
136 *
137 * * `enableExpressionOptimizations' (true, false_ [=true])
138 *
139 * Optimize expressions to simplify them where possible.
140 */
162 const std::vector<poplar::Tensor> &ts,
164 const poplar::DebugContext &debugContext = {},
165 const poplar::OptionFlags &options = {});
166
167inline poplar::Tensor map(poplar::Graph &graph, expr::UnaryOpType op,
168 const poplar::Tensor &t,
170 const poplar::DebugContext &debugContext = {},
171 const poplar::OptionFlags &options = {}) {
172
173 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(op, t, options));
174 auto output =
175 map(graph, expr::UnaryOp(op, expr::_1), {t}, prog, {di}, options);
176 di.addOutput(output);
177 return output;
178}
179
180inline poplar::Tensor map(poplar::Graph &graph, expr::BinaryOpType op,
181 const poplar::Tensor &a, const poplar::Tensor &b,
183 const poplar::DebugContext &debugContext = {},
184 const poplar::OptionFlags &options = {}) {
185 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(op, a, b, options));
186 auto output = map(graph, expr::BinaryOp(op, expr::_1, expr::_2), {a, b}, prog,
187 {di}, options);
188 di.addOutput(output);
189 return output;
190}
191
192inline poplar::Tensor map(poplar::Graph &graph, expr::TernaryOpType op,
193 const poplar::Tensor &a, const poplar::Tensor &b,
194 const poplar::Tensor &c,
196 const poplar::DebugContext &debugContext = {},
197 const poplar::OptionFlags &options = {}) {
198 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(op, a, b, c, options));
199 auto output = map(graph, expr::TernaryOp(op, expr::_1, expr::_2, expr::_3),
200 {a, b, c}, prog, {di}, options);
201 di.addOutput(output);
202 return output;
203}
210void mapInPlace(poplar::Graph &graph, const expr::Expr &expr,
211 const std::vector<poplar::Tensor> &ts,
213 const poplar::DebugContext &debugContext = {},
214 const poplar::OptionFlags &options = {});
215
216inline void mapInPlace(poplar::Graph &graph, expr::UnaryOpType op,
218 const poplar::DebugContext &debugContext = {},
219 const poplar::OptionFlags &options = {}) {
220 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(op, t, options));
221
222 mapInPlace(graph, expr::UnaryOp(op, expr::_1), {t}, prog, {di}, options);
223}
224
225inline void mapInPlace(poplar::Graph &graph, expr::BinaryOpType op,
226 const poplar::Tensor &a, const poplar::Tensor &b,
228 const poplar::DebugContext &debugContext = {},
229 const poplar::OptionFlags &options = {}) {
230 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(op, a, b, options));
231
232 mapInPlace(graph, expr::BinaryOp(op, expr::_1, expr::_2), {a, b}, prog, {di},
233 options);
234}
235
236inline void mapInPlace(poplar::Graph &graph, expr::TernaryOpType op,
237 const poplar::Tensor &a, const poplar::Tensor &b,
239 const poplar::DebugContext &debugContext = {},
240 const poplar::OptionFlags &options = {}) {
241 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(op, a, b, c, options));
242
243 mapInPlace(graph, expr::TernaryOp(op, expr::_1, expr::_2, expr::_3),
244 {a, b, c}, prog, {di}, options);
245}
252void mapWithOutput(poplar::Graph &graph, const expr::Expr &expr,
253 const std::vector<poplar::Tensor> &ts,
255 const poplar::DebugContext &debugContext = {},
256 const poplar::OptionFlags &options = {});
257
258inline void mapWithOutput(poplar::Graph &graph, expr::UnaryOpType op,
259 const poplar::Tensor &in, const poplar::Tensor &out,
261 const poplar::DebugContext &debugContext = {},
262 const poplar::OptionFlags &options = {}) {
263 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(op, in, out, options));
264
265 mapWithOutput(graph, expr::UnaryOp(op, expr::_1), {in}, out, prog, {di},
266 options);
267}
268
269inline void mapWithOutput(poplar::Graph &graph, expr::BinaryOpType op,
270 const poplar::Tensor &a, const poplar::Tensor &b,
271 const poplar::Tensor &out,
273 const poplar::DebugContext &debugContext = {},
274 const poplar::OptionFlags &options = {}) {
275 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(op, a, b, out, options));
276
277 mapWithOutput(graph, expr::BinaryOp(op, expr::_1, expr::_2), {a, b}, out,
278 prog, {di}, options);
279}
280
281inline void mapWithOutput(poplar::Graph &graph, expr::TernaryOpType op,
282 const poplar::Tensor &a, const poplar::Tensor &b,
283 const poplar::Tensor &c, const poplar::Tensor &out,
285 const poplar::DebugContext &debugContext = {},
286 const poplar::OptionFlags &options = {}) {
287 poputil::PoplibsOpDebugInfo di(debugContext,
288 DI_ARGS(op, a, b, c, out, options));
289
290 mapWithOutput(graph, expr::TernaryOp(op, expr::_1, expr::_2, expr::_3),
291 {a, b, c}, out, prog, {di}, options);
292}
293
314 const expr::Expr &expr,
315 const std::vector<poplar::Tensor> &ts,
316 const poplar::OptionFlags &options,
317 std::ostream &os);
318
319// Unary operations
320
337 const poplar::DebugContext &debugContext = {},
338 const poplar::OptionFlags &options = {}) {
339 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
340
341 auto output = map(graph, expr::UnaryOpType::ABSOLUTE, A, prog, {di}, options);
342 di.addOutput(output);
343 return output;
344}
345
348inline void absInPlace(poplar::Graph &graph, const poplar::Tensor &A,
350 const poplar::DebugContext &debugContext = {},
351 const poplar::OptionFlags &options = {}) {
352 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
353
354 mapInPlace(graph, expr::UnaryOpType::ABSOLUTE, A, prog, {di}, options);
355}
356
359inline void absWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
360 const poplar::Tensor &out,
362 const poplar::DebugContext &debugContext = {},
363 const poplar::OptionFlags &options = {}) {
364 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, out, options));
365
366 mapWithOutput(graph, expr::UnaryOpType::ABSOLUTE, A, out, prog, {di},
367 options);
368}
385 const poplar::DebugContext &debugContext = {},
386 const poplar::OptionFlags &options = {}) {
387 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
388
389 auto output = map(graph, expr::UnaryOpType::ASIN, A, prog, {di}, options);
390 di.addOutput(output);
391 return output;
392}
393
396inline void asinInPlace(poplar::Graph &graph, const poplar::Tensor &A,
398 const poplar::DebugContext &debugContext = {},
399 const poplar::OptionFlags &options = {}) {
400 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
401
402 mapInPlace(graph, expr::UnaryOpType::ASIN, A, prog, {di}, options);
403}
404
407inline void asinWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
408 const poplar::Tensor &out,
410 const poplar::DebugContext &debugContext = {},
411 const poplar::OptionFlags &options = {}) {
412 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, out, options));
413
414 mapWithOutput(graph, expr::UnaryOpType::ASIN, A, out, prog, {di}, options);
415}
416
431 const poplar::DebugContext &debugContext = {},
432 const poplar::OptionFlags &options = {}) {
433 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
434
435 auto output =
436 map(graph, expr::UnaryOpType::BITWISE_NOT, A, prog, {di}, options);
437 di.addOutput(output);
438 return output;
439}
440
443inline void bitwiseNotInPlace(poplar::Graph &graph, const poplar::Tensor &A,
445 const poplar::DebugContext &debugContext = {},
446 const poplar::OptionFlags &options = {}) {
447 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
448
449 mapInPlace(graph, expr::UnaryOpType::BITWISE_NOT, A, prog, {di}, options);
450}
451
455 const poplar::Tensor &out,
457 const poplar::DebugContext &debugContext = {},
458 const poplar::OptionFlags &options = {}) {
459 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, out, options));
460
461 mapWithOutput(graph, expr::UnaryOpType::BITWISE_NOT, A, out, prog, {di},
462 options);
463}
464
479 const poplar::DebugContext &debugContext = {},
480 const poplar::OptionFlags &options = {}) {
481 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
482
483 auto output = map(graph, expr::UnaryOpType::CBRT, A, prog, {di}, options);
484 di.addOutput(output);
485 return output;
486}
487
490inline void cbrtInPlace(poplar::Graph &graph, const poplar::Tensor &A,
492 const poplar::DebugContext &debugContext = {},
493 const poplar::OptionFlags &options = {}) {
494 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
495
496 mapInPlace(graph, expr::UnaryOpType::CBRT, A, prog, {di}, options);
497}
498
501inline void cbrtWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
502 const poplar::Tensor &out,
504 const poplar::DebugContext &debugContext = {},
505 const poplar::OptionFlags &options = {}) {
506 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, out, options));
507
508 mapWithOutput(graph, expr::UnaryOpType::CBRT, A, out, prog, {di}, options);
509}
510
526 const poplar::DebugContext &debugContext = {},
527 const poplar::OptionFlags &options = {}) {
528 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
529
530 auto output = map(graph, expr::UnaryOpType::GELU_ERF, A, prog, {di}, options);
531 di.addOutput(output);
532 return output;
533}
534
537inline void geluErfInPlace(poplar::Graph &graph, const poplar::Tensor &A,
539 const poplar::DebugContext &debugContext = {},
540 const poplar::OptionFlags &options = {}) {
541 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
542
543 mapInPlace(graph, expr::UnaryOpType::GELU_ERF, A, prog, {di}, options);
544}
545
548inline void geluErfWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
549 const poplar::Tensor &out,
551 const poplar::DebugContext &debugContext = {},
552 const poplar::OptionFlags &options = {}) {
553 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, out, options));
554
555 mapWithOutput(graph, expr::UnaryOpType::GELU_ERF, A, out, prog, {di},
556 options);
557}
558
573 const poplar::DebugContext &debugContext = {},
574 const poplar::OptionFlags &options = {}) {
575 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
576
577 auto output = map(graph, expr::UnaryOpType::CEIL, A, prog, {di}, options);
578 di.addOutput(output);
579 return output;
580}
581
584inline void ceilInPlace(poplar::Graph &graph, const poplar::Tensor &A,
586 const poplar::DebugContext &debugContext = {},
587 const poplar::OptionFlags &options = {}) {
588 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
589
590 mapInPlace(graph, expr::UnaryOpType::CEIL, A, prog, {di}, options);
591}
592
595inline void ceilWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
596 const poplar::Tensor &out,
598 const poplar::DebugContext &debugContext = {},
599 const poplar::OptionFlags &options = {}) {
600 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, out, options));
601
602 mapWithOutput(graph, expr::UnaryOpType::CEIL, A, out, prog, {di}, options);
603}
604
619inline poplar::Tensor
622 const poplar::DebugContext &debugContext = {},
623 const poplar::OptionFlags &options = {}) {
624 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
625
626 auto output = map(graph, expr::UnaryOpType::COUNT_LEADING_ZEROS, A, prog,
627 {di}, options);
628 di.addOutput(output);
629 return output;
630}
631
634inline void
637 const poplar::DebugContext &debugContext = {},
638 const poplar::OptionFlags &options = {}) {
639 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
640
641 mapInPlace(graph, expr::UnaryOpType::COUNT_LEADING_ZEROS, A, prog, {di},
642 options);
643}
644
647inline void
649 const poplar::Tensor &out,
651 const poplar::DebugContext &debugContext = {},
652 const poplar::OptionFlags &options = {}) {
653 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, out, options));
654
655 mapWithOutput(graph, expr::UnaryOpType::COUNT_LEADING_ZEROS, A, out, prog,
656 {di}, options);
657}
658
673 const poplar::DebugContext &debugContext = {},
674 const poplar::OptionFlags &options = {}) {
675 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
676 auto output = map(graph, expr::UnaryOpType::COS, A, prog, {di}, options);
677 di.addOutput(output);
678 return output;
679}
680
683inline void cosInPlace(poplar::Graph &graph, const poplar::Tensor &A,
685 const poplar::DebugContext &debugContext = {},
686 const poplar::OptionFlags &options = {}) {
687 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
688 mapInPlace(graph, expr::UnaryOpType::COS, A, prog, {di}, options);
689}
690
693inline void cosWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
694 const poplar::Tensor &out,
696 const poplar::DebugContext &debugContext = {},
697 const poplar::OptionFlags &options = {}) {
698 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, out, options));
699 mapWithOutput(graph, expr::UnaryOpType::COS, A, out, prog, {di}, options);
700}
701
716 const poplar::DebugContext &debugContext = {},
717 const poplar::OptionFlags &options = {}) {
718 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
719 auto output = map(graph, expr::UnaryOpType::ERF, A, prog, {di}, options);
720 di.addOutput(output);
721 return output;
722}
723
726inline void erfInPlace(poplar::Graph &graph, const poplar::Tensor &A,
728 const poplar::DebugContext &debugContext = {},
729 const poplar::OptionFlags &options = {}) {
730 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
731 mapInPlace(graph, expr::UnaryOpType::ERF, A, prog, {di}, options);
732}
733
736inline void erfWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
737 const poplar::Tensor &out,
739 const poplar::DebugContext &debugContext = {},
740 const poplar::OptionFlags &options = {}) {
741 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, out, options));
742 mapWithOutput(graph, expr::UnaryOpType::ERF, A, out, prog, {di}, options);
743}
744
759 const poplar::DebugContext &debugContext = {},
760 const poplar::OptionFlags &options = {}) {
761 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
762 auto output = map(graph, expr::UnaryOpType::EXPONENT, A, prog, {di}, options);
763 di.addOutput(output);
764 return output;
765}
766
769inline void expInPlace(poplar::Graph &graph, const poplar::Tensor &A,
771 const poplar::DebugContext &debugContext = {},
772 const poplar::OptionFlags &options = {}) {
773 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
774 mapInPlace(graph, expr::UnaryOpType::EXPONENT, A, prog, {di}, options);
775}
776
779inline void expWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
780 const poplar::Tensor &out,
782 const poplar::DebugContext &debugContext = {},
783 const poplar::OptionFlags &options = {}) {
784 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, out, options));
785 mapWithOutput(graph, expr::UnaryOpType::EXPONENT, A, out, prog, {di},
786 options);
787}
788
803 const poplar::DebugContext &debugContext = {},
804 const poplar::OptionFlags &options = {}) {
805 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
806 auto output =
807 map(graph, expr::UnaryOpType::EXPONENT_MINUS_ONE, A, prog, {di}, options);
808 di.addOutput(output);
809 return output;
810}
811
814inline void expm1InPlace(poplar::Graph &graph, const poplar::Tensor &A,
816 const poplar::DebugContext &debugContext = {},
817 const poplar::OptionFlags &options = {}) {
818 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
819 mapInPlace(graph, expr::UnaryOpType::EXPONENT_MINUS_ONE, A, prog, {di},
820 options);
821}
822
825inline void expm1WithOutput(poplar::Graph &graph, const poplar::Tensor &A,
826 const poplar::Tensor &out,
828 const poplar::DebugContext &debugContext = {},
829 const poplar::OptionFlags &options = {}) {
830 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, out, options));
831 mapWithOutput(graph, expr::UnaryOpType::EXPONENT_MINUS_ONE, A, out, prog,
832 {di}, options);
833}
834
849 const poplar::DebugContext &debugContext = {},
850 const poplar::OptionFlags &options = {}) {
851 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
852 auto output = map(graph, expr::UnaryOpType::FLOOR, A, prog, {di}, options);
853 di.addOutput(output);
854 return output;
855}
856
859inline void floorInPlace(poplar::Graph &graph, const poplar::Tensor &A,
861 const poplar::DebugContext &debugContext = {},
862 const poplar::OptionFlags &options = {}) {
863 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
864 mapInPlace(graph, expr::UnaryOpType::FLOOR, A, prog, {di}, options);
865}
866
869inline void floorWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
870 const poplar::Tensor &out,
872 const poplar::DebugContext &debugContext = {},
873 const poplar::OptionFlags &options = {}) {
874 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, out, options));
875 mapWithOutput(graph, expr::UnaryOpType::FLOOR, A, out, prog, {di}, options);
876}
877
892 const poplar::DebugContext &debugContext = {},
893 const poplar::OptionFlags &options = {}) {
894 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
895 auto output = map(graph, expr::UnaryOpType::INVERSE, A, prog, {di}, options);
896 di.addOutput(output);
897 return output;
898}
899
902inline void invInPlace(poplar::Graph &graph, const poplar::Tensor &A,
904 const poplar::DebugContext &debugContext = {},
905 const poplar::OptionFlags &options = {}) {
906 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
907 mapInPlace(graph, expr::UnaryOpType::INVERSE, A, prog, {di}, options);
908}
909
912inline void invWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
913 const poplar::Tensor &out,
915 const poplar::DebugContext &debugContext = {},
916 const poplar::OptionFlags &options = {}) {
917 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, out, options));
918 mapWithOutput(graph, expr::UnaryOpType::INVERSE, A, out, prog, {di}, options);
919}
920
935 const poplar::DebugContext &debugContext = {},
936 const poplar::OptionFlags &options = {}) {
937 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
938
939 auto output =
940 map(graph, expr::UnaryOpType::LOGARITHM, A, prog, {di}, options);
941 di.addOutput(output);
942 return output;
943}
944
947inline void logInPlace(poplar::Graph &graph, const poplar::Tensor &A,
949 const poplar::DebugContext &debugContext = {},
950 const poplar::OptionFlags &options = {}) {
951 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
952
953 mapInPlace(graph, expr::UnaryOpType::LOGARITHM, A, prog, {di}, options);
954}
955
958inline void logWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
959 const poplar::Tensor &out,
961 const poplar::DebugContext &debugContext = {},
962 const poplar::OptionFlags &options = {}) {
963 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, out, options));
964
965 mapWithOutput(graph, expr::UnaryOpType::LOGARITHM, A, out, prog, {di},
966 options);
967}
968
983 const poplar::DebugContext &debugContext = {},
984 const poplar::OptionFlags &options = {}) {
985 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
986
987 auto output =
988 map(graph, expr::UnaryOpType::LOGARITHM_ONE_PLUS, A, prog, {di}, options);
989 di.addOutput(output);
990 return output;
991}
992
995inline void log1pInPlace(poplar::Graph &graph, const poplar::Tensor &A,
997 const poplar::DebugContext &debugContext = {},
998 const poplar::OptionFlags &options = {}) {
999 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
1000
1001 mapInPlace(graph, expr::UnaryOpType::LOGARITHM_ONE_PLUS, A, prog, {di},
1002 options);
1003}
1004
1007inline void log1pWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
1008 const poplar::Tensor &out,
1010 const poplar::DebugContext &debugContext = {},
1011 const poplar::OptionFlags &options = {}) {
1012 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, out, options));
1013
1014 mapWithOutput(graph, expr::UnaryOpType::LOGARITHM_ONE_PLUS, A, out, prog,
1015 {di}, options);
1016}
1017
1032 const poplar::DebugContext &debugContext = {},
1033 const poplar::OptionFlags &options = {}) {
1034 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
1035
1036 auto output =
1037 map(graph, expr::UnaryOpType::LOGICAL_NOT, A, prog, {di}, options);
1038 di.addOutput(output);
1039 return output;
1040}
1041
1046 const poplar::DebugContext &debugContext = {},
1047 const poplar::OptionFlags &options = {}) {
1048 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
1049
1050 mapInPlace(graph, expr::UnaryOpType::LOGICAL_NOT, A, prog, {di}, options);
1051}
1052
1056 const poplar::Tensor &out,
1058 const poplar::DebugContext &debugContext = {},
1059 const poplar::OptionFlags &options = {}) {
1060 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, out, options));
1061
1062 mapWithOutput(graph, expr::UnaryOpType::LOGICAL_NOT, A, out, prog, {di},
1063 options);
1064}
1065
1080 const poplar::DebugContext &debugContext = {},
1081 const poplar::OptionFlags &options = {}) {
1082 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
1083
1084 auto output = map(graph, expr::UnaryOpType::NEGATE, A, prog, {di}, options);
1085 di.addOutput(output);
1086 return output;
1087}
1088
1091inline void negInPlace(poplar::Graph &graph, const poplar::Tensor &A,
1093 const poplar::DebugContext &debugContext = {},
1094 const poplar::OptionFlags &options = {}) {
1095 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
1096
1097 mapInPlace(graph, expr::UnaryOpType::NEGATE, A, prog, {di}, options);
1098}
1099
1102inline void negWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
1103 const poplar::Tensor &out,
1105 const poplar::DebugContext &debugContext = {},
1106 const poplar::OptionFlags &options = {}) {
1107 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, out, options));
1108
1109 mapWithOutput(graph, expr::UnaryOpType::NEGATE, A, out, prog, {di}, options);
1110}
1111
1126 const poplar::DebugContext &debugContext = {},
1127 const poplar::OptionFlags &options = {}) {
1128 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
1129
1130 auto output = map(graph, expr::UnaryOpType::POPCOUNT, A, prog, {di}, options);
1131 di.addOutput(output);
1132 return output;
1133}
1134
1137inline void popcountInPlace(poplar::Graph &graph, const poplar::Tensor &A,
1139 const poplar::DebugContext &debugContext = {},
1140 const poplar::OptionFlags &options = {}) {
1141 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
1142
1143 mapInPlace(graph, expr::UnaryOpType::POPCOUNT, A, prog, {di}, options);
1144}
1145
1149 const poplar::Tensor &out,
1151 const poplar::DebugContext &debugContext = {},
1152 const poplar::OptionFlags &options = {}) {
1153 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, out, options));
1154
1155 mapWithOutput(graph, expr::UnaryOpType::POPCOUNT, A, out, prog, {di},
1156 options);
1157}
1158
1174 const poplar::DebugContext &debugContext = {},
1175 const poplar::OptionFlags &options = {}) {
1176 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
1177
1178 auto output = map(graph, expr::UnaryOpType::SIGNUM, A, prog, {di}, options);
1179 di.addOutput(output);
1180 return output;
1181}
1182
1185inline void signumInPlace(poplar::Graph &graph, const poplar::Tensor &A,
1187 const poplar::DebugContext &debugContext = {},
1188 const poplar::OptionFlags &options = {}) {
1189 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
1190
1191 mapInPlace(graph, expr::UnaryOpType::SIGNUM, A, prog, {di}, options);
1192}
1193
1196inline void signumWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
1197 const poplar::Tensor &out,
1199 const poplar::DebugContext &debugContext = {},
1200 const poplar::OptionFlags &options = {}) {
1201 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, out, options));
1202
1203 mapWithOutput(graph, expr::UnaryOpType::SIGNUM, A, out, prog, {di}, options);
1204}
1205
1220 const poplar::DebugContext &debugContext = {},
1221 const poplar::OptionFlags &options = {}) {
1222 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
1223
1224 auto output = map(graph, expr::UnaryOpType::SIN, A, prog, {di}, options);
1225 di.addOutput(output);
1226 return output;
1227}
1228
1231inline void sinInPlace(poplar::Graph &graph, const poplar::Tensor &A,
1233 const poplar::DebugContext &debugContext = {},
1234 const poplar::OptionFlags &options = {}) {
1235 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
1236
1237 mapInPlace(graph, expr::UnaryOpType::SIN, A, prog, {di}, options);
1238}
1239
1242inline void sinWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
1243 const poplar::Tensor &out,
1245 const poplar::DebugContext &debugContext = {},
1246 const poplar::OptionFlags &options = {}) {
1247 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, out, options));
1248
1249 mapWithOutput(graph, expr::UnaryOpType::SIN, A, out, prog, {di}, options);
1250}
1251
1266 const poplar::DebugContext &debugContext = {},
1267 const poplar::OptionFlags &options = {}) {
1268 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
1269
1270 auto output = map(graph, expr::UnaryOpType::TAN, A, prog, {di}, options);
1271 di.addOutput(output);
1272 return output;
1273}
1274
1277inline void tanInPlace(poplar::Graph &graph, const poplar::Tensor &A,
1279 const poplar::DebugContext &debugContext = {},
1280 const poplar::OptionFlags &options = {}) {
1281 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
1282
1283 mapInPlace(graph, expr::UnaryOpType::TAN, A, prog, {di}, options);
1284}
1285
1288inline void tanWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
1289 const poplar::Tensor &out,
1291 const poplar::DebugContext &debugContext = {},
1292 const poplar::OptionFlags &options = {}) {
1293 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, out, options));
1294
1295 mapWithOutput(graph, expr::UnaryOpType::TAN, A, out, prog, {di}, options);
1296}
1297
1312 const poplar::DebugContext &debugContext = {},
1313 const poplar::OptionFlags &options = {}) {
1314 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
1315
1316 auto output = map(graph, expr::UnaryOpType::TANH, A, prog, {di}, options);
1317 di.addOutput(output);
1318 return output;
1319}
1320
1323inline void tanhInPlace(poplar::Graph &graph, const poplar::Tensor &A,
1325 const poplar::DebugContext &debugContext = {},
1326 const poplar::OptionFlags &options = {}) {
1327 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
1328
1329 mapInPlace(graph, expr::UnaryOpType::TANH, A, prog, {di}, options);
1330}
1331
1334inline void tanhWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
1335 const poplar::Tensor &out,
1337 const poplar::DebugContext &debugContext = {},
1338 const poplar::OptionFlags &options = {}) {
1339 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, out, options));
1340
1341 mapWithOutput(graph, expr::UnaryOpType::TANH, A, out, prog, {di}, options);
1342}
1343
1358 const poplar::DebugContext &debugContext = {},
1359 const poplar::OptionFlags &options = {}) {
1360 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
1361
1362 auto output = map(graph, expr::UnaryOpType::ROUND, A, prog, {di}, options);
1363 di.addOutput(output);
1364 return output;
1365}
1366
1369inline void roundInPlace(poplar::Graph &graph, const poplar::Tensor &A,
1371 const poplar::DebugContext &debugContext = {},
1372 const poplar::OptionFlags &options = {}) {
1373 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
1374
1375 mapInPlace(graph, expr::UnaryOpType::ROUND, A, prog, {di}, options);
1376}
1377
1380inline void roundWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
1381 const poplar::Tensor &out,
1383 const poplar::DebugContext &debugContext = {},
1384 const poplar::OptionFlags &options = {}) {
1385 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, out, options));
1386
1387 mapWithOutput(graph, expr::UnaryOpType::ROUND, A, out, prog, {di}, options);
1388}
1389
1404 const poplar::DebugContext &debugContext = {},
1405 const poplar::OptionFlags &options = {}) {
1406 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
1407
1408 auto output = map(graph, expr::UnaryOpType::SQRT, A, prog, {di}, options);
1409 di.addOutput(output);
1410 return output;
1411}
1412
1415inline void sqrtInPlace(poplar::Graph &graph, const poplar::Tensor &A,
1417 const poplar::DebugContext &debugContext = {},
1418 const poplar::OptionFlags &options = {}) {
1419 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
1420
1421 mapInPlace(graph, expr::UnaryOpType::SQRT, A, prog, {di}, options);
1422}
1423
1426inline void sqrtWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
1427 const poplar::Tensor &out,
1429 const poplar::DebugContext &debugContext = {},
1430 const poplar::OptionFlags &options = {}) {
1431 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, out, options));
1432
1433 mapWithOutput(graph, expr::UnaryOpType::SQRT, A, out, prog, {di}, options);
1434}
1435
1450 const poplar::DebugContext &debugContext = {},
1451 const poplar::OptionFlags &options = {}) {
1452 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
1453
1454 auto output = map(graph, expr::UnaryOpType::SQUARE, A, prog, {di}, options);
1455 di.addOutput(output);
1456 return output;
1457}
1458
1461inline void squareInPlace(poplar::Graph &graph, const poplar::Tensor &A,
1463 const poplar::DebugContext &debugContext = {},
1464 const poplar::OptionFlags &options = {}) {
1465 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
1466
1467 mapInPlace(graph, expr::UnaryOpType::SQUARE, A, prog, {di}, options);
1468}
1469
1472inline void squareWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
1473 const poplar::Tensor &out,
1475 const poplar::DebugContext &debugContext = {},
1476 const poplar::OptionFlags &options = {}) {
1477 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, out, options));
1478
1479 mapWithOutput(graph, expr::UnaryOpType::SQUARE, A, out, prog, {di}, options);
1480}
1481
1496 const poplar::DebugContext &debugContext = {},
1497 const poplar::OptionFlags &options = {}) {
1498 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
1499
1500 auto output = map(graph, expr::UnaryOpType::SIGMOID, A, prog, {di}, options);
1501 di.addOutput(output);
1502 return output;
1503}
1504
1507inline void sigmoidInPlace(poplar::Graph &graph, const poplar::Tensor &A,
1509 const poplar::DebugContext &debugContext = {},
1510 const poplar::OptionFlags &options = {}) {
1511 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
1512
1513 mapInPlace(graph, expr::UnaryOpType::SIGMOID, A, prog, {di}, options);
1514}
1515
1519 const poplar::Tensor &out,
1521 const poplar::DebugContext &debugContext = {},
1522 const poplar::OptionFlags &options = {}) {
1523 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, out, options));
1524
1525 mapWithOutput(graph, expr::UnaryOpType::SIGMOID, A, out, prog, {di}, options);
1526}
1527
1542 const poplar::DebugContext &debugContext = {},
1543 const poplar::OptionFlags &options = {}) {
1544 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
1545
1546 auto output = map(graph, expr::UnaryOpType::RSQRT, A, prog, {di}, options);
1547 di.addOutput(output);
1548 return output;
1549}
1550
1553inline void rsqrtInPlace(poplar::Graph &graph, const poplar::Tensor &A,
1555 const poplar::DebugContext &debugContext = {},
1556 const poplar::OptionFlags &options = {}) {
1557 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
1558
1559 mapInPlace(graph, expr::UnaryOpType::RSQRT, A, prog, {di}, options);
1560}
1561
1564inline void rsqrtWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
1565 const poplar::Tensor &out,
1567 const poplar::DebugContext &debugContext = {},
1568 const poplar::OptionFlags &options = {}) {
1569 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, out, options));
1570
1571 mapWithOutput(graph, expr::UnaryOpType::RSQRT, A, out, prog, {di}, options);
1572}
1573
1588 const poplar::DebugContext &debugContext = {},
1589 const poplar::OptionFlags &options = {}) {
1590 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, options));
1591
1592 auto output =
1593 map(graph, expr::UnaryOpType::IS_FINITE, A, prog, {di}, options);
1594 di.addOutput(output);
1595 return output;
1596}
1597
1601 const poplar::Tensor &out,
1603 const poplar::DebugContext &debugContext = {},
1604 const poplar::OptionFlags &options = {}) {
1605 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, out, options));
1606 mapWithOutput(graph, expr::UnaryOpType::IS_FINITE, A, out, prog, {di},
1607 options);
1608}
1609
1621template <typename constType>
1622inline void checkTypes(poplar::Type elementType, constType) {
1623 if (elementType != poplar::equivalent_device_type<constType>().value) {
1624 throw std::runtime_error("Type mismatch between Binary op Tensor "
1625 "and constant");
1626 }
1627}
1628
1629template <> inline void checkTypes<float>(poplar::Type elementType, float) {
1630 if (elementType != poplar::FLOAT && elementType != poplar::HALF) {
1631 throw std::runtime_error("Type mismatch between Binary op Tensor "
1632 "and constant");
1633 }
1634 return;
1635}
1636
1637template <> inline void checkTypes<double>(poplar::Type elementType, double) {
1638 if (elementType != poplar::FLOAT && elementType != poplar::HALF) {
1639 throw std::runtime_error("Type mismatch between Binary op Tensor "
1640 "and constant");
1641 }
1642 return;
1643}
1646// Binary operations
1647
1665 const poplar::Tensor &B,
1667 const poplar::DebugContext &debugContext = {},
1668 const poplar::OptionFlags &options = {}) {
1669 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
1670
1671 auto output = map(graph, expr::BinaryOpType::ADD, A, B, prog, {di}, options);
1672 di.addOutput(output);
1673 return output;
1674}
1675
1676template <typename constType>
1677inline poplar::Tensor add(poplar::Graph &graph, const poplar::Tensor &A,
1678 const constType B, poplar::program::Sequence &prog,
1679 const poplar::DebugContext &debugContext = {},
1680 const poplar::OptionFlags &options = {}) {
1681 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
1682
1683 checkTypes(A.elementType(), B);
1684 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
1685 graph.setTileMapping(BTensor, 0);
1686 auto output =
1687 map(graph, expr::BinaryOpType::ADD, A, BTensor, prog, {di}, options);
1688 di.addOutput(output);
1689 return output;
1690}
1691
1692template <typename constType>
1693inline poplar::Tensor add(poplar::Graph &graph, const constType A,
1694 const poplar::Tensor &B,
1696 const poplar::DebugContext &debugContext = {},
1697 const poplar::OptionFlags &options = {}) {
1698 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
1699
1700 checkTypes(B.elementType(), A);
1701 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
1702 graph.setTileMapping(ATensor, 0);
1703 auto output =
1704 map(graph, expr::BinaryOpType::ADD, ATensor, B, prog, {di}, options);
1705 di.addOutput(output);
1706 return output;
1707}
1714inline void addInPlace(poplar::Graph &graph, const poplar::Tensor &A,
1716 const poplar::DebugContext &debugContext = {},
1717 const poplar::OptionFlags &options = {}) {
1718 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
1719
1720 mapInPlace(graph, expr::BinaryOpType::ADD, A, B, prog, {di}, options);
1721}
1722
1723template <typename constType>
1724inline void addInPlace(poplar::Graph &graph, const poplar::Tensor &A,
1725 const constType B, poplar::program::Sequence &prog,
1726 const poplar::DebugContext &debugContext = {},
1727 const poplar::OptionFlags &options = {}) {
1728 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
1729
1730 checkTypes(A.elementType(), B);
1731 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
1732 graph.setTileMapping(BTensor, 0);
1733 mapInPlace(graph, expr::BinaryOpType::ADD, A, BTensor, prog, {di}, options);
1734}
1741inline void addWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
1742 const poplar::Tensor &B, const poplar::Tensor &out,
1744 const poplar::DebugContext &debugContext = {},
1745 const poplar::OptionFlags &options = {}) {
1746 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
1747
1748 mapWithOutput(graph, expr::BinaryOpType::ADD, A, B, out, prog, {di}, options);
1749}
1750
1751template <typename constType>
1752inline void addWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
1753 const constType B, const poplar::Tensor &out,
1755 const poplar::DebugContext &debugContext = {},
1756 const poplar::OptionFlags &options = {}) {
1757 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
1758
1759 checkTypes(A.elementType(), B);
1760 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
1761 graph.setTileMapping(BTensor, 0);
1762 mapWithOutput(graph, expr::BinaryOpType::ADD, A, BTensor, out, prog, {di},
1763 options);
1764}
1765
1766template <typename constType>
1767inline void addWithOutput(poplar::Graph &graph, const constType A,
1768 const poplar::Tensor &B, const poplar::Tensor &out,
1770 const poplar::DebugContext &debugContext = {},
1771 const poplar::OptionFlags &options = {}) {
1772 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
1773
1774 checkTypes(B.elementType(), A);
1775 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
1776 graph.setTileMapping(ATensor, 0);
1777 mapWithOutput(graph, expr::BinaryOpType::ADD, ATensor, B, out, prog, {di},
1778 options);
1779}
1800 const poplar::Tensor &B,
1802 const poplar::DebugContext &debugContext = {},
1803 const poplar::OptionFlags &options = {}) {
1804 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
1805
1806 auto output =
1807 map(graph, expr::BinaryOpType::ATAN2, A, B, prog, {di}, options);
1808 di.addOutput(output);
1809 return output;
1810}
1811
1812template <typename constType>
1813inline poplar::Tensor atan2(poplar::Graph &graph, const poplar::Tensor &A,
1814 const constType B, poplar::program::Sequence &prog,
1815 const poplar::DebugContext &debugContext = {},
1816 const poplar::OptionFlags &options = {}) {
1817 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
1818
1819 checkTypes(A.elementType(), B);
1820 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
1821 graph.setTileMapping(BTensor, 0);
1822 auto output =
1823 map(graph, expr::BinaryOpType::ATAN2, A, BTensor, prog, {di}, options);
1824 di.addOutput(output);
1825 return output;
1826}
1827
1828template <typename constType>
1829inline poplar::Tensor atan2(poplar::Graph &graph, const constType A,
1830 const poplar::Tensor &B,
1832 const poplar::DebugContext &debugContext = {},
1833 const poplar::OptionFlags &options = {}) {
1834 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
1835
1836 checkTypes(B.elementType(), A);
1837 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
1838 graph.setTileMapping(ATensor, 0);
1839 auto output =
1840 map(graph, expr::BinaryOpType::ATAN2, ATensor, B, prog, {di}, options);
1841 di.addOutput(output);
1842 return output;
1843}
1850inline void atan2InPlace(poplar::Graph &graph, const poplar::Tensor &A,
1851 const poplar::Tensor &B,
1853 const poplar::DebugContext &debugContext = {},
1854 const poplar::OptionFlags &options = {}) {
1855 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
1856
1857 mapInPlace(graph, expr::BinaryOpType::ATAN2, A, B, prog, {di}, options);
1858}
1859
1860template <typename constType>
1861inline void atan2InPlace(poplar::Graph &graph, const poplar::Tensor &A,
1862 const constType B, poplar::program::Sequence &prog,
1863 const poplar::DebugContext &debugContext = {},
1864 const poplar::OptionFlags &options = {}) {
1865 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
1866
1867 checkTypes(A.elementType(), B);
1868 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
1869 graph.setTileMapping(BTensor, 0);
1870 mapInPlace(graph, expr::BinaryOpType::ATAN2, A, BTensor, prog, {di}, options);
1871}
1878inline void atan2WithOutput(poplar::Graph &graph, const poplar::Tensor &A,
1879 const poplar::Tensor &B, const poplar::Tensor &out,
1881 const poplar::DebugContext &debugContext = {},
1882 const poplar::OptionFlags &options = {}) {
1883 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
1884
1885 mapWithOutput(graph, expr::BinaryOpType::ATAN2, A, B, out, prog, {di},
1886 options);
1887}
1888
1889template <typename constType>
1890inline void atan2WithOutput(poplar::Graph &graph, const poplar::Tensor &A,
1891 const constType B, const poplar::Tensor &out,
1893 const poplar::DebugContext &debugContext = {},
1894 const poplar::OptionFlags &options = {}) {
1895 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
1896
1897 checkTypes(A.elementType(), B);
1898 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
1899 graph.setTileMapping(BTensor, 0);
1900 mapWithOutput(graph, expr::BinaryOpType::ATAN2, A, BTensor, out, prog, {di},
1901 options);
1902}
1903
1904template <typename constType>
1905inline void atan2WithOutput(poplar::Graph &graph, const constType A,
1906 const poplar::Tensor &B, const poplar::Tensor &out,
1908 const poplar::DebugContext &debugContext = {},
1909 const poplar::OptionFlags &options = {}) {
1910 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
1911
1912 checkTypes(B.elementType(), A);
1913 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
1914 graph.setTileMapping(ATensor, 0);
1915 mapWithOutput(graph, expr::BinaryOpType::ATAN2, ATensor, B, out, prog, {di},
1916 options);
1917}
1937 const poplar::Tensor &B,
1939 const poplar::DebugContext &debugContext = {},
1940 const poplar::OptionFlags &options = {}) {
1941 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
1942
1943 auto output =
1944 map(graph, expr::BinaryOpType::BITWISE_AND, A, B, prog, {di}, options);
1945 di.addOutput(output);
1946 return output;
1947}
1948
1949template <typename constType>
1951 const constType B,
1953 const poplar::DebugContext &debugContext = {},
1954 const poplar::OptionFlags &options = {}) {
1955 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
1956
1957 checkTypes(A.elementType(), B);
1958 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
1959 graph.setTileMapping(BTensor, 0);
1960 auto output = map(graph, expr::BinaryOpType::BITWISE_AND, A, BTensor, prog,
1961 {di}, options);
1962 di.addOutput(output);
1963 return output;
1964}
1965template <typename constType>
1966inline poplar::Tensor bitwiseAnd(poplar::Graph &graph, const constType A,
1967 const poplar::Tensor &B,
1969 const poplar::DebugContext &debugContext = {},
1970 const poplar::OptionFlags &options = {}) {
1971 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
1972
1973 checkTypes(B.elementType(), A);
1974 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
1975 graph.setTileMapping(ATensor, 0);
1976 auto output = map(graph, expr::BinaryOpType::BITWISE_AND, ATensor, B, prog,
1977 {di}, options);
1978 di.addOutput(output);
1979 return output;
1980}
1988 const poplar::Tensor &B,
1990 const poplar::DebugContext &debugContext = {},
1991 const poplar::OptionFlags &options = {}) {
1992 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
1993
1994 mapInPlace(graph, expr::BinaryOpType::BITWISE_AND, A, B, prog, {di}, options);
1995}
1996
1997template <typename constType>
1998inline void bitwiseAndInPlace(poplar::Graph &graph, const poplar::Tensor &A,
1999 const constType B,
2001 const poplar::DebugContext &debugContext = {},
2002 const poplar::OptionFlags &options = {}) {
2003 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
2004
2005 checkTypes(A.elementType(), B);
2006 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
2007 graph.setTileMapping(BTensor, 0);
2008 mapInPlace(graph, expr::BinaryOpType::BITWISE_AND, A, BTensor, prog, {di},
2009 options);
2010}
2018 const poplar::Tensor &B,
2019 const poplar::Tensor &out,
2021 const poplar::DebugContext &debugContext = {},
2022 const poplar::OptionFlags &options = {}) {
2023 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
2024
2025 mapWithOutput(graph, expr::BinaryOpType::BITWISE_AND, A, B, out, prog, {di},
2026 options);
2027}
2028
2029template <typename constType>
2030inline void bitwiseAndWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
2031 const constType B, const poplar::Tensor &out,
2033 const poplar::DebugContext &debugContext = {},
2034 const poplar::OptionFlags &options = {}) {
2035 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
2036
2037 checkTypes(A.elementType(), B);
2038 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
2039 graph.setTileMapping(BTensor, 0);
2040 mapWithOutput(graph, expr::BinaryOpType::BITWISE_AND, A, BTensor, out, prog,
2041 {di}, options);
2042}
2043template <typename constType>
2044inline void bitwiseAndWithOutput(poplar::Graph &graph, const constType A,
2045 const poplar::Tensor &B,
2046 const poplar::Tensor &out,
2048 const poplar::DebugContext &debugContext = {},
2049 const poplar::OptionFlags &options = {}) {
2050 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
2051
2052 checkTypes(B.elementType(), A);
2053 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
2054 graph.setTileMapping(ATensor, 0);
2055 mapWithOutput(graph, expr::BinaryOpType::BITWISE_AND, ATensor, B, out, prog,
2056 {di}, options);
2057}
2078 const poplar::Tensor &B,
2080 const poplar::DebugContext &debugContext = {},
2081 const poplar::OptionFlags &options = {}) {
2082 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
2083
2084 auto output =
2085 map(graph, expr::BinaryOpType::BITWISE_OR, A, B, prog, {di}, options);
2086 di.addOutput(output);
2087 return output;
2088}
2089
2090template <typename constType>
2092 const constType B,
2094 const poplar::DebugContext &debugContext = {},
2095 const poplar::OptionFlags &options = {}) {
2096 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
2097
2098 checkTypes(A.elementType(), B);
2099 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
2100 graph.setTileMapping(BTensor, 0);
2101 auto output = map(graph, expr::BinaryOpType::BITWISE_OR, A, BTensor, prog,
2102 {di}, options);
2103 di.addOutput(output);
2104 return output;
2105}
2106
2107template <typename constType>
2108inline poplar::Tensor bitwiseOr(poplar::Graph &graph, const constType A,
2109 const poplar::Tensor &B,
2111 const poplar::DebugContext &debugContext = {},
2112 const poplar::OptionFlags &options = {}) {
2113 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
2114
2115 checkTypes(B.elementType(), A);
2116 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
2117 graph.setTileMapping(ATensor, 0);
2118 auto output = map(graph, expr::BinaryOpType::BITWISE_OR, ATensor, B, prog,
2119 {di}, options);
2120 di.addOutput(output);
2121 return output;
2122}
2129inline void bitwiseOrInPlace(poplar::Graph &graph, const poplar::Tensor &A,
2130 const poplar::Tensor &B,
2132 const poplar::DebugContext &debugContext = {},
2133 const poplar::OptionFlags &options = {}) {
2134 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
2135
2136 mapInPlace(graph, expr::BinaryOpType::BITWISE_OR, A, B, prog, {di}, options);
2137}
2138
2139template <typename constType>
2140inline void bitwiseOrInPlace(poplar::Graph &graph, const poplar::Tensor &A,
2141 const constType B, poplar::program::Sequence &prog,
2142 const poplar::DebugContext &debugContext = {},
2143 const poplar::OptionFlags &options = {}) {
2144 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
2145
2146 checkTypes(A.elementType(), B);
2147 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
2148 graph.setTileMapping(BTensor, 0);
2149 mapInPlace(graph, expr::BinaryOpType::BITWISE_OR, A, BTensor, prog, {di},
2150 options);
2151}
2159 const poplar::Tensor &B,
2160 const poplar::Tensor &out,
2162 const poplar::DebugContext &debugContext = {},
2163 const poplar::OptionFlags &options = {}) {
2164 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
2165
2166 mapWithOutput(graph, expr::BinaryOpType::BITWISE_OR, A, B, out, prog, {di},
2167 options);
2168}
2169
2170template <typename constType>
2171inline void bitwiseOrWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
2172 const constType B, const poplar::Tensor &out,
2174 const poplar::DebugContext &debugContext = {},
2175 const poplar::OptionFlags &options = {}) {
2176 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
2177
2178 checkTypes(A.elementType(), B);
2179 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
2180 graph.setTileMapping(BTensor, 0);
2181 mapWithOutput(graph, expr::BinaryOpType::BITWISE_OR, A, BTensor, out, prog,
2182 {di}, options);
2183}
2184
2185template <typename constType>
2186inline void bitwiseOrWithOutput(poplar::Graph &graph, const constType A,
2187 const poplar::Tensor &B,
2188 const poplar::Tensor &out,
2190 const poplar::DebugContext &debugContext = {},
2191 const poplar::OptionFlags &options = {}) {
2192 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
2193
2194 checkTypes(B.elementType(), A);
2195 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
2196 graph.setTileMapping(ATensor, 0);
2197 mapWithOutput(graph, expr::BinaryOpType::BITWISE_OR, ATensor, B, out, prog,
2198 {di}, options);
2199}
2220 const poplar::Tensor &B,
2222 const poplar::DebugContext &debugContext = {},
2223 const poplar::OptionFlags &options = {}) {
2224 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
2225
2226 auto output =
2227 map(graph, expr::BinaryOpType::BITWISE_XOR, A, B, prog, {di}, options);
2228 di.addOutput(output);
2229 return output;
2230}
2231
2232template <typename constType>
2234 const constType B,
2236 const poplar::DebugContext &debugContext = {},
2237 const poplar::OptionFlags &options = {}) {
2238 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
2239
2240 checkTypes(A.elementType(), B);
2241 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
2242 graph.setTileMapping(BTensor, 0);
2243 auto output = map(graph, expr::BinaryOpType::BITWISE_XOR, A, BTensor, prog,
2244 {di}, options);
2245 di.addOutput(output);
2246 return output;
2247}
2248
2249template <typename constType>
2250inline poplar::Tensor bitwiseXor(poplar::Graph &graph, const constType A,
2251 const poplar::Tensor &B,
2253 const poplar::DebugContext &debugContext = {},
2254 const poplar::OptionFlags &options = {}) {
2255 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
2256
2257 checkTypes(B.elementType(), A);
2258 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
2259 graph.setTileMapping(ATensor, 0);
2260 auto output = map(graph, expr::BinaryOpType::BITWISE_XOR, ATensor, B, prog,
2261 {di}, options);
2262 di.addOutput(output);
2263 return output;
2264}
2272 const poplar::Tensor &B,
2274 const poplar::DebugContext &debugContext = {},
2275 const poplar::OptionFlags &options = {}) {
2276 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
2277
2278 mapInPlace(graph, expr::BinaryOpType::BITWISE_XOR, A, B, prog, {di}, options);
2279}
2280
2281template <typename constType>
2282inline void bitwiseXorInPlace(poplar::Graph &graph, const poplar::Tensor &A,
2283 const constType B,
2285 const poplar::DebugContext &debugContext = {},
2286 const poplar::OptionFlags &options = {}) {
2287 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
2288
2289 checkTypes(A.elementType(), B);
2290 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
2291 graph.setTileMapping(BTensor, 0);
2292 mapInPlace(graph, expr::BinaryOpType::BITWISE_XOR, A, BTensor, prog, {di},
2293 options);
2294}
2302 const poplar::Tensor &B,
2303 const poplar::Tensor &out,
2305 const poplar::DebugContext &debugContext = {},
2306 const poplar::OptionFlags &options = {}) {
2307 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
2308
2309 mapWithOutput(graph, expr::BinaryOpType::BITWISE_XOR, A, B, out, prog, {di},
2310 options);
2311}
2312
2313template <typename constType>
2314inline void bitwiseXorWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
2315 const constType B, const poplar::Tensor &out,
2317 const poplar::DebugContext &debugContext = {},
2318 const poplar::OptionFlags &options = {}) {
2319 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
2320
2321 checkTypes(A.elementType(), B);
2322 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
2323 graph.setTileMapping(BTensor, 0);
2324 mapWithOutput(graph, expr::BinaryOpType::BITWISE_XOR, A, BTensor, out, prog,
2325 {di}, options);
2326}
2327
2328template <typename constType>
2329inline void bitwiseXorWithOutput(poplar::Graph &graph, const constType A,
2330 const poplar::Tensor &B,
2331 const poplar::Tensor &out,
2333 const poplar::DebugContext &debugContext = {},
2334 const poplar::OptionFlags &options = {}) {
2335 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
2336
2337 checkTypes(B.elementType(), A);
2338 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
2339 graph.setTileMapping(ATensor, 0);
2340 mapWithOutput(graph, expr::BinaryOpType::BITWISE_XOR, ATensor, B, out, prog,
2341 {di}, options);
2342}
2363 const poplar::Tensor &B,
2365 const poplar::DebugContext &debugContext = {},
2366 const poplar::OptionFlags &options = {}) {
2367 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
2368
2369 auto output =
2370 map(graph, expr::BinaryOpType::BITWISE_XNOR, A, B, prog, {di}, options);
2371 di.addOutput(output);
2372 return output;
2373}
2374
2375template <typename constType>
2377 const constType B,
2379 const poplar::DebugContext &debugContext = {},
2380 const poplar::OptionFlags &options = {}) {
2381 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
2382
2383 checkTypes(A.elementType(), B);
2384 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
2385 graph.setTileMapping(BTensor, 0);
2386 auto output = map(graph, expr::BinaryOpType::BITWISE_XNOR, A, BTensor, prog,
2387 {di}, options);
2388 di.addOutput(output);
2389 return output;
2390}
2391
2392template <typename constType>
2393inline poplar::Tensor bitwiseXnor(poplar::Graph &graph, const constType A,
2394 const poplar::Tensor &B,
2396 const poplar::DebugContext &debugContext = {},
2397 const poplar::OptionFlags &options = {}) {
2398 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
2399
2400 checkTypes(B.elementType(), A);
2401 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
2402 graph.setTileMapping(ATensor, 0);
2403 auto output = map(graph, expr::BinaryOpType::BITWISE_XNOR, ATensor, B, prog,
2404 {di}, options);
2405 di.addOutput(output);
2406 return output;
2407}
2408
2416 const poplar::Tensor &B,
2418 const poplar::DebugContext &debugContext = {},
2419 const poplar::OptionFlags &options = {}) {
2420 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
2421
2422 mapInPlace(graph, expr::BinaryOpType::BITWISE_XNOR, A, B, prog, {di},
2423 options);
2424}
2425
2426template <typename constType>
2427inline void bitwiseXnorInPlace(poplar::Graph &graph, const poplar::Tensor &A,
2428 const constType B,
2430 const poplar::DebugContext &debugContext = {},
2431 const poplar::OptionFlags &options = {}) {
2432 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
2433
2434 checkTypes(A.elementType(), B);
2435 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
2436 graph.setTileMapping(BTensor, 0);
2437 mapInPlace(graph, expr::BinaryOpType::BITWISE_XNOR, A, BTensor, prog, {di},
2438 options);
2439}
2447 const poplar::Tensor &B,
2448 const poplar::Tensor &out,
2450 const poplar::DebugContext &debugContext = {},
2451 const poplar::OptionFlags &options = {}) {
2452 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
2453
2454 mapWithOutput(graph, expr::BinaryOpType::BITWISE_XNOR, A, B, out, prog, {di},
2455 options);
2456}
2457
2458template <typename constType>
2459inline void bitwiseXnorWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
2460 const constType B, const poplar::Tensor &out,
2462 const poplar::DebugContext &debugContext = {},
2463 const poplar::OptionFlags &options = {}) {
2464 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
2465
2466 checkTypes(A.elementType(), B);
2467 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
2468 graph.setTileMapping(BTensor, 0);
2469 mapWithOutput(graph, expr::BinaryOpType::BITWISE_XNOR, A, BTensor, out, prog,
2470 {di}, options);
2471}
2472
2473template <typename constType>
2474inline void bitwiseXnorWithOutput(poplar::Graph &graph, const constType A,
2475 const poplar::Tensor &B,
2476 const poplar::Tensor &out,
2478 const poplar::DebugContext &debugContext = {},
2479 const poplar::OptionFlags &options = {}) {
2480 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
2481
2482 checkTypes(B.elementType(), A);
2483 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
2484 graph.setTileMapping(ATensor, 0);
2485 mapWithOutput(graph, expr::BinaryOpType::BITWISE_XNOR, ATensor, B, out, prog,
2486 {di}, options);
2487}
2488
2508 const poplar::Tensor &B,
2510 const poplar::DebugContext &debugContext = {},
2511 const poplar::OptionFlags &options = {}) {
2512 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
2513
2514 auto output =
2515 map(graph, expr::BinaryOpType::DIVIDE, A, B, prog, {di}, options);
2516 di.addOutput(output);
2517 return output;
2518}
2519
2520template <typename constType>
2521inline poplar::Tensor div(poplar::Graph &graph, const poplar::Tensor &A,
2522 const constType B, poplar::program::Sequence &prog,
2523 const poplar::DebugContext &debugContext = {},
2524 const poplar::OptionFlags &options = {}) {
2525 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
2526
2527 checkTypes(A.elementType(), B);
2528 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
2529 graph.setTileMapping(BTensor, 0);
2530 auto output =
2531 map(graph, expr::BinaryOpType::DIVIDE, A, BTensor, prog, {di}, options);
2532 di.addOutput(output);
2533 return output;
2534}
2535
2536template <typename constType>
2537inline poplar::Tensor div(poplar::Graph &graph, const constType A,
2538 const poplar::Tensor &B,
2540 const poplar::DebugContext &debugContext = {},
2541 const poplar::OptionFlags &options = {}) {
2542 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
2543
2544 checkTypes(B.elementType(), A);
2545 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
2546 graph.setTileMapping(ATensor, 0);
2547 auto output =
2548 map(graph, expr::BinaryOpType::DIVIDE, ATensor, B, prog, {di}, options);
2549 di.addOutput(output);
2550 return output;
2551}
2558inline void divInPlace(poplar::Graph &graph, const poplar::Tensor &A,
2560 const poplar::DebugContext &debugContext = {},
2561 const poplar::OptionFlags &options = {}) {
2562 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
2563
2564 mapInPlace(graph, expr::BinaryOpType::DIVIDE, A, B, prog, {di}, options);
2565}
2566
2567template <typename constType>
2568inline void divInPlace(poplar::Graph &graph, const poplar::Tensor &A,
2569 const constType B, poplar::program::Sequence &prog,
2570 const poplar::DebugContext &debugContext = {},
2571 const poplar::OptionFlags &options = {}) {
2572 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
2573
2574 checkTypes(A.elementType(), B);
2575 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
2576 graph.setTileMapping(BTensor, 0);
2577 mapInPlace(graph, expr::BinaryOpType::DIVIDE, A, BTensor, prog, {di},
2578 options);
2579}
2586inline void divWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
2587 const poplar::Tensor &B, const poplar::Tensor &out,
2589 const poplar::DebugContext &debugContext = {},
2590 const poplar::OptionFlags &options = {}) {
2591 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
2592
2593 mapWithOutput(graph, expr::BinaryOpType::DIVIDE, A, B, out, prog, {di},
2594 options);
2595}
2596
2597template <typename constType>
2598inline void divWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
2599 const constType B, const poplar::Tensor &out,
2601 const poplar::DebugContext &debugContext = {},
2602 const poplar::OptionFlags &options = {}) {
2603 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
2604
2605 checkTypes(A.elementType(), B);
2606 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
2607 graph.setTileMapping(BTensor, 0);
2608 mapWithOutput(graph, expr::BinaryOpType::DIVIDE, A, BTensor, out, prog, {di},
2609 options);
2610}
2611
2612template <typename constType>
2613inline void divWithOutput(poplar::Graph &graph, const constType A,
2614 const poplar::Tensor &B, const poplar::Tensor &out,
2616 const poplar::DebugContext &debugContext = {},
2617 const poplar::OptionFlags &options = {}) {
2618 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
2619
2620 checkTypes(B.elementType(), A);
2621 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
2622 graph.setTileMapping(ATensor, 0);
2623 mapWithOutput(graph, expr::BinaryOpType::DIVIDE, ATensor, B, out, prog, {di},
2624 options);
2625}
2645 const poplar::Tensor &B,
2647 const poplar::DebugContext &debugContext = {},
2648 const poplar::OptionFlags &options = {}) {
2649 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
2650
2651 auto output =
2652 map(graph, expr::BinaryOpType::EQUAL, A, B, prog, {di}, options);
2653 di.addOutput(output);
2654 return output;
2655}
2656
2657template <typename constType>
2658inline poplar::Tensor eq(poplar::Graph &graph, const poplar::Tensor &A,
2659 const constType B, poplar::program::Sequence &prog,
2660 const poplar::DebugContext &debugContext = {},
2661 const poplar::OptionFlags &options = {}) {
2662 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
2663
2664 checkTypes(A.elementType(), B);
2665 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
2666 graph.setTileMapping(BTensor, 0);
2667 auto output =
2668 map(graph, expr::BinaryOpType::EQUAL, A, BTensor, prog, {di}, options);
2669 di.addOutput(output);
2670 return output;
2671}
2672
2673template <typename constType>
2674inline poplar::Tensor eq(poplar::Graph &graph, const constType A,
2675 const poplar::Tensor &B,
2677 const poplar::DebugContext &debugContext = {},
2678 const poplar::OptionFlags &options = {}) {
2679 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
2680
2681 checkTypes(B.elementType(), A);
2682 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
2683 graph.setTileMapping(ATensor, 0);
2684 auto output =
2685 map(graph, expr::BinaryOpType::EQUAL, ATensor, B, prog, {di}, options);
2686 di.addOutput(output);
2687 return output;
2688}
2695inline void eqInPlace(poplar::Graph &graph, const poplar::Tensor &A,
2697 const poplar::DebugContext &debugContext = {},
2698 const poplar::OptionFlags &options = {}) {
2699 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
2700
2701 mapInPlace(graph, expr::BinaryOpType::EQUAL, A, B, prog, {di}, options);
2702}
2703
2704template <typename constType>
2705inline void eqInPlace(poplar::Graph &graph, const poplar::Tensor &A,
2706 const constType B, poplar::program::Sequence &prog,
2707 const poplar::DebugContext &debugContext = {},
2708 const poplar::OptionFlags &options = {}) {
2709 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
2710
2711 checkTypes(A.elementType(), B);
2712 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
2713 graph.setTileMapping(BTensor, 0);
2714 mapInPlace(graph, expr::BinaryOpType::EQUAL, A, BTensor, prog, {di}, options);
2715}
2722inline void eqWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
2723 const poplar::Tensor &B, const poplar::Tensor &out,
2725 const poplar::DebugContext &debugContext = {},
2726 const poplar::OptionFlags &options = {}) {
2727 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
2728
2729 mapWithOutput(graph, expr::BinaryOpType::EQUAL, A, B, out, prog, {di},
2730 options);
2731}
2732
2733template <typename constType>
2734inline void eqWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
2735 const constType B, const poplar::Tensor &out,
2737 const poplar::DebugContext &debugContext = {},
2738 const poplar::OptionFlags &options = {}) {
2739 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
2740
2741 checkTypes(A.elementType(), B);
2742 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
2743 graph.setTileMapping(BTensor, 0);
2744 mapWithOutput(graph, expr::BinaryOpType::EQUAL, A, BTensor, out, prog, {di},
2745 options);
2746}
2747
2748template <typename constType>
2749inline void eqWithOutput(poplar::Graph &graph, const constType A,
2750 const poplar::Tensor &B, const poplar::Tensor &out,
2752 const poplar::DebugContext &debugContext = {},
2753 const poplar::OptionFlags &options = {}) {
2754 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
2755
2756 checkTypes(B.elementType(), A);
2757 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
2758 graph.setTileMapping(ATensor, 0);
2759 mapWithOutput(graph, expr::BinaryOpType::EQUAL, ATensor, B, out, prog, {di},
2760 options);
2761}
2782 const poplar::Tensor &B,
2784 const poplar::DebugContext &debugContext = {},
2785 const poplar::OptionFlags &options = {}) {
2786 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
2787
2788 auto output = map(graph, expr::BinaryOpType::GREATER_THAN_EQUAL, A, B, prog,
2789 {di}, options);
2790 di.addOutput(output);
2791 return output;
2792}
2793
2794template <typename constType>
2795inline poplar::Tensor gteq(poplar::Graph &graph, const poplar::Tensor &A,
2796 const constType B, poplar::program::Sequence &prog,
2797 const poplar::DebugContext &debugContext = {},
2798 const poplar::OptionFlags &options = {}) {
2799 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
2800
2801 checkTypes(A.elementType(), B);
2802 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
2803 graph.setTileMapping(BTensor, 0);
2804 auto output = map(graph, expr::BinaryOpType::GREATER_THAN_EQUAL, A, BTensor,
2805 prog, {di}, options);
2806 di.addOutput(output);
2807 return output;
2808}
2809
2810template <typename constType>
2811inline poplar::Tensor gteq(poplar::Graph &graph, const constType A,
2812 const poplar::Tensor &B,
2814 const poplar::DebugContext &debugContext = {},
2815 const poplar::OptionFlags &options = {}) {
2816 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
2817
2818 checkTypes(B.elementType(), A);
2819 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
2820 graph.setTileMapping(ATensor, 0);
2821 auto output = map(graph, expr::BinaryOpType::GREATER_THAN_EQUAL, ATensor, B,
2822 prog, {di}, options);
2823 di.addOutput(output);
2824 return output;
2825}
2832inline void gteqInPlace(poplar::Graph &graph, const poplar::Tensor &A,
2833 const poplar::Tensor &B,
2835 const poplar::DebugContext &debugContext = {},
2836 const poplar::OptionFlags &options = {}) {
2837 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
2838
2839 mapInPlace(graph, expr::BinaryOpType::GREATER_THAN_EQUAL, A, B, prog, {di},
2840 options);
2841}
2842
2843template <typename constType>
2844inline void gteqInPlace(poplar::Graph &graph, const poplar::Tensor &A,
2845 const constType B, poplar::program::Sequence &prog,
2846 const poplar::DebugContext &debugContext = {},
2847 const poplar::OptionFlags &options = {}) {
2848 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
2849
2850 checkTypes(A.elementType(), B);
2851 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
2852 graph.setTileMapping(BTensor, 0);
2853 mapInPlace(graph, expr::BinaryOpType::GREATER_THAN_EQUAL, A, BTensor, prog,
2854 {di}, options);
2855}
2862inline void gteqWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
2863 const poplar::Tensor &B, const poplar::Tensor &out,
2865 const poplar::DebugContext &debugContext = {},
2866 const poplar::OptionFlags &options = {}) {
2867 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
2868
2869 mapWithOutput(graph, expr::BinaryOpType::GREATER_THAN_EQUAL, A, B, out, prog,
2870 {di}, options);
2871}
2872
2873template <typename constType>
2874inline void gteqWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
2875 const constType B, const poplar::Tensor &out,
2877 const poplar::DebugContext &debugContext = {},
2878 const poplar::OptionFlags &options = {}) {
2879 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
2880
2881 checkTypes(A.elementType(), B);
2882 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
2883 graph.setTileMapping(BTensor, 0);
2884 mapWithOutput(graph, expr::BinaryOpType::GREATER_THAN_EQUAL, A, BTensor, out,
2885 prog, {di}, options);
2886}
2887
2888template <typename constType>
2889inline void gteqWithOutput(poplar::Graph &graph, const constType A,
2890 const poplar::Tensor &B, const poplar::Tensor &out,
2892 const poplar::DebugContext &debugContext = {},
2893 const poplar::OptionFlags &options = {}) {
2894 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
2895
2896 checkTypes(B.elementType(), A);
2897 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
2898 graph.setTileMapping(ATensor, 0);
2899 mapWithOutput(graph, expr::BinaryOpType::GREATER_THAN_EQUAL, ATensor, B, out,
2900 prog, {di}, options);
2901}
2922 const poplar::Tensor &B,
2924 const poplar::DebugContext &debugContext = {},
2925 const poplar::OptionFlags &options = {}) {
2926 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
2927
2928 auto output =
2929 map(graph, expr::BinaryOpType::GREATER_THAN, A, B, prog, {di}, options);
2930 di.addOutput(output);
2931 return output;
2932}
2933
2934template <typename constType>
2935inline poplar::Tensor gt(poplar::Graph &graph, const poplar::Tensor &A,
2936 const constType B, poplar::program::Sequence &prog,
2937 const poplar::DebugContext &debugContext = {},
2938 const poplar::OptionFlags &options = {}) {
2939 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
2940
2941 checkTypes(A.elementType(), B);
2942 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
2943 graph.setTileMapping(BTensor, 0);
2944 auto output = map(graph, expr::BinaryOpType::GREATER_THAN, A, BTensor, prog,
2945 {di}, options);
2946 di.addOutput(output);
2947 return output;
2948}
2949
2950template <typename constType>
2951inline poplar::Tensor gt(poplar::Graph &graph, const constType A,
2952 const poplar::Tensor &B,
2954 const poplar::DebugContext &debugContext = {},
2955 const poplar::OptionFlags &options = {}) {
2956 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
2957
2958 checkTypes(B.elementType(), A);
2959 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
2960 graph.setTileMapping(ATensor, 0);
2961 auto output = map(graph, expr::BinaryOpType::GREATER_THAN, ATensor, B, prog,
2962 {di}, options);
2963 di.addOutput(output);
2964 return output;
2965}
2972inline void gtInPlace(poplar::Graph &graph, const poplar::Tensor &A,
2974 const poplar::DebugContext &debugContext = {},
2975 const poplar::OptionFlags &options = {}) {
2976 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
2977
2978 mapInPlace(graph, expr::BinaryOpType::GREATER_THAN, A, B, prog, {di},
2979 options);
2980}
2981
2982template <typename constType>
2983inline void gtInPlace(poplar::Graph &graph, const poplar::Tensor &A,
2984 const constType B, poplar::program::Sequence &prog,
2985 const poplar::DebugContext &debugContext = {},
2986 const poplar::OptionFlags &options = {}) {
2987 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
2988
2989 checkTypes(A.elementType(), B);
2990 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
2991 graph.setTileMapping(BTensor, 0);
2992 mapInPlace(graph, expr::BinaryOpType::GREATER_THAN, A, BTensor, prog, {di},
2993 options);
2994}
3001inline void gtWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
3002 const poplar::Tensor &B, const poplar::Tensor &out,
3004 const poplar::DebugContext &debugContext = {},
3005 const poplar::OptionFlags &options = {}) {
3006 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
3007
3008 mapWithOutput(graph, expr::BinaryOpType::GREATER_THAN, A, B, out, prog, {di},
3009 options);
3010}
3011
3012template <typename constType>
3013inline void gtWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
3014 const constType B, const poplar::Tensor &out,
3016 const poplar::DebugContext &debugContext = {},
3017 const poplar::OptionFlags &options = {}) {
3018 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
3019
3020 checkTypes(A.elementType(), B);
3021 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
3022 graph.setTileMapping(BTensor, 0);
3023 mapWithOutput(graph, expr::BinaryOpType::GREATER_THAN, A, BTensor, out, prog,
3024 {di}, options);
3025}
3026
3027template <typename constType>
3028inline void gtWithOutput(poplar::Graph &graph, const constType A,
3029 const poplar::Tensor &B, const poplar::Tensor &out,
3031 const poplar::DebugContext &debugContext = {},
3032 const poplar::OptionFlags &options = {}) {
3033 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
3034
3035 checkTypes(B.elementType(), A);
3036 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
3037 graph.setTileMapping(ATensor, 0);
3038 mapWithOutput(graph, expr::BinaryOpType::GREATER_THAN, ATensor, B, out, prog,
3039 {di}, options);
3040}
3060inline poplar::Tensor
3063 const poplar::DebugContext &debugContext = {},
3064 const poplar::OptionFlags &options = {}) {
3065 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
3066
3067 auto output = map(graph, expr::BinaryOpType::INV_STD_DEV_TO_VARIANCE, A, B,
3068 prog, {di}, options);
3069 di.addOutput(output);
3070 return output;
3071}
3072
3073template <typename constType>
3074inline poplar::Tensor
3076 const constType B, poplar::program::Sequence &prog,
3077 const poplar::DebugContext &debugContext = {},
3078 const poplar::OptionFlags &options = {}) {
3079 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
3080
3081 checkTypes(A.elementType(), B);
3082 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
3083 graph.setTileMapping(BTensor, 0);
3084 auto output = map(graph, expr::BinaryOpType::INV_STD_DEV_TO_VARIANCE, A,
3085 BTensor, prog, {di}, options);
3086 di.addOutput(output);
3087 return output;
3088}
3089
3090template <typename constType>
3091inline poplar::Tensor
3092invStdDevToVariance(poplar::Graph &graph, const constType A,
3094 const poplar::DebugContext &debugContext = {},
3095 const poplar::OptionFlags &options = {}) {
3096 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
3097
3098 checkTypes(B.elementType(), A);
3099 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
3100 graph.setTileMapping(ATensor, 0);
3101 auto output = map(graph, expr::BinaryOpType::INV_STD_DEV_TO_VARIANCE, ATensor,
3102 B, prog, {di}, options);
3103 di.addOutput(output);
3104 return output;
3105}
3112inline void
3114 const poplar::Tensor &B,
3116 const poplar::DebugContext &debugContext = {},
3117 const poplar::OptionFlags &options = {}) {
3118 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
3119
3120 mapInPlace(graph, expr::BinaryOpType::INV_STD_DEV_TO_VARIANCE, A, B, prog,
3121 {di}, options);
3122}
3123
3124template <typename constType>
3125inline void
3127 const constType B, poplar::program::Sequence &prog,
3128 const poplar::DebugContext &debugContext = {},
3129 const poplar::OptionFlags &options = {}) {
3130 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
3131
3132 checkTypes(A.elementType(), B);
3133 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
3134 graph.setTileMapping(BTensor, 0);
3135 mapInPlace(graph, expr::BinaryOpType::INV_STD_DEV_TO_VARIANCE, A, BTensor,
3136 prog, {di}, options);
3137}
3145 poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B,
3146 const poplar::Tensor &out, poplar::program::Sequence &prog,
3147 const poplar::DebugContext &debugContext = {},
3148 const poplar::OptionFlags &options = {}) {
3149 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
3150
3151 mapWithOutput(graph, expr::BinaryOpType::INV_STD_DEV_TO_VARIANCE, A, B, out,
3152 prog, {di}, options);
3153}
3154
3155template <typename constType>
3156inline void
3158 const constType B, const poplar::Tensor &out,
3160 const poplar::DebugContext &debugContext = {},
3161 const poplar::OptionFlags &options = {}) {
3162 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
3163
3164 checkTypes(A.elementType(), B);
3165 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
3166 graph.setTileMapping(BTensor, 0);
3167 mapWithOutput(graph, expr::BinaryOpType::INV_STD_DEV_TO_VARIANCE, A, BTensor,
3168 out, prog, {di}, options);
3169}
3170
3171template <typename constType>
3173 poplar::Graph &graph, const constType A, const poplar::Tensor &B,
3174 const poplar::Tensor &out, poplar::program::Sequence &prog,
3175 const poplar::DebugContext &debugContext = {},
3176 const poplar::OptionFlags &options = {}) {
3177 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
3178
3179 checkTypes(B.elementType(), A);
3180 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
3181 graph.setTileMapping(ATensor, 0);
3182 mapWithOutput(graph, expr::BinaryOpType::INV_STD_DEV_TO_VARIANCE, ATensor, B,
3183 out, prog, {di}, options);
3184}
3205 const poplar::Tensor &B,
3207 const poplar::DebugContext &debugContext = {},
3208 const poplar::OptionFlags &options = {}) {
3209 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
3210
3211 auto output = map(graph, expr::BinaryOpType::LESS_THAN_EQUAL, A, B, prog,
3212 {di}, options);
3213 di.addOutput(output);
3214 return output;
3215}
3216
3217template <typename constType>
3218inline poplar::Tensor lteq(poplar::Graph &graph, const poplar::Tensor &A,
3219 const constType B, poplar::program::Sequence &prog,
3220 const poplar::DebugContext &debugContext = {},
3221 const poplar::OptionFlags &options = {}) {
3222 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
3223
3224 checkTypes(A.elementType(), B);
3225 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
3226 graph.setTileMapping(BTensor, 0);
3227 auto output = map(graph, expr::BinaryOpType::LESS_THAN_EQUAL, A, BTensor,
3228 prog, {di}, options);
3229 di.addOutput(output);
3230 return output;
3231}
3232
3233template <typename constType>
3234inline poplar::Tensor lteq(poplar::Graph &graph, const constType A,
3235 const poplar::Tensor &B,
3237 const poplar::DebugContext &debugContext = {},
3238 const poplar::OptionFlags &options = {}) {
3239 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
3240
3241 checkTypes(B.elementType(), A);
3242 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
3243 graph.setTileMapping(ATensor, 0);
3244 auto output = map(graph, expr::BinaryOpType::LESS_THAN_EQUAL, ATensor, B,
3245 prog, {di}, options);
3246 di.addOutput(output);
3247 return output;
3248}
3255inline void lteqInPlace(poplar::Graph &graph, const poplar::Tensor &A,
3256 const poplar::Tensor &B,
3258 const poplar::DebugContext &debugContext = {},
3259 const poplar::OptionFlags &options = {}) {
3260 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
3261
3262 mapInPlace(graph, expr::BinaryOpType::LESS_THAN_EQUAL, A, B, prog, {di},
3263 options);
3264}
3265
3266template <typename constType>
3267inline void lteqInPlace(poplar::Graph &graph, const poplar::Tensor &A,
3268 const constType B, poplar::program::Sequence &prog,
3269 const poplar::DebugContext &debugContext = {},
3270 const poplar::OptionFlags &options = {}) {
3271 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
3272
3273 checkTypes(A.elementType(), B);
3274 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
3275 graph.setTileMapping(BTensor, 0);
3276 mapInPlace(graph, expr::BinaryOpType::LESS_THAN_EQUAL, A, BTensor, prog, {di},
3277 options);
3278}
3285inline void lteqWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
3286 const poplar::Tensor &B, const poplar::Tensor &out,
3288 const poplar::DebugContext &debugContext = {},
3289 const poplar::OptionFlags &options = {}) {
3290 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
3291
3292 mapWithOutput(graph, expr::BinaryOpType::LESS_THAN_EQUAL, A, B, out, prog,
3293 {di}, options);
3294}
3295
3296template <typename constType>
3297inline void lteqWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
3298 const constType B, const poplar::Tensor &out,
3300 const poplar::DebugContext &debugContext = {},
3301 const poplar::OptionFlags &options = {}) {
3302 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
3303
3304 checkTypes(A.elementType(), B);
3305 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
3306 graph.setTileMapping(BTensor, 0);
3307 mapWithOutput(graph, expr::BinaryOpType::LESS_THAN_EQUAL, A, BTensor, out,
3308 prog, {di}, options);
3309}
3310
3311template <typename constType>
3312inline void lteqWithOutput(poplar::Graph &graph, const constType A,
3313 const poplar::Tensor &B, const poplar::Tensor &out,
3315 const poplar::DebugContext &debugContext = {},
3316 const poplar::OptionFlags &options = {}) {
3317 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
3318
3319 checkTypes(B.elementType(), A);
3320 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
3321 graph.setTileMapping(ATensor, 0);
3322 mapWithOutput(graph, expr::BinaryOpType::LESS_THAN_EQUAL, ATensor, B, out,
3323 prog, {di}, options);
3324}
3345 const poplar::Tensor &B,
3347 const poplar::DebugContext &debugContext = {},
3348 const poplar::OptionFlags &options = {}) {
3349 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
3350
3351 auto output =
3352 map(graph, expr::BinaryOpType::LOGICAL_AND, A, B, prog, {di}, options);
3353 di.addOutput(output);
3354 return output;
3355}
3356
3357template <typename constType>
3359 const constType B,
3361 const poplar::DebugContext &debugContext = {},
3362 const poplar::OptionFlags &options = {}) {
3363 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
3364
3365 checkTypes(A.elementType(), B);
3366 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
3367 graph.setTileMapping(BTensor, 0);
3368 auto output = map(graph, expr::BinaryOpType::LOGICAL_AND, A, BTensor, prog,
3369 {di}, options);
3370 di.addOutput(output);
3371 return output;
3372}
3373
3374template <typename constType>
3375inline poplar::Tensor logicalAnd(poplar::Graph &graph, const constType A,
3376 const poplar::Tensor &B,
3378 const poplar::DebugContext &debugContext = {},
3379 const poplar::OptionFlags &options = {}) {
3380 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
3381
3382 checkTypes(B.elementType(), A);
3383 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
3384 graph.setTileMapping(ATensor, 0);
3385 auto output = map(graph, expr::BinaryOpType::LOGICAL_AND, ATensor, B, prog,
3386 {di}, options);
3387 di.addOutput(output);
3388 return output;
3389}
3397 const poplar::Tensor &B,
3399 const poplar::DebugContext &debugContext = {},
3400 const poplar::OptionFlags &options = {}) {
3401 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
3402
3403 mapInPlace(graph, expr::BinaryOpType::LOGICAL_AND, A, B, prog, {di}, options);
3404}
3405
3406template <typename constType>
3407inline void logicalAndInPlace(poplar::Graph &graph, const poplar::Tensor &A,
3408 const constType B,
3410 const poplar::DebugContext &debugContext = {},
3411 const poplar::OptionFlags &options = {}) {
3412 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
3413
3414 checkTypes(A.elementType(), B);
3415 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
3416 graph.setTileMapping(BTensor, 0);
3417 mapInPlace(graph, expr::BinaryOpType::LOGICAL_AND, A, BTensor, prog, {di},
3418 options);
3419}
3427 const poplar::Tensor &B,
3428 const poplar::Tensor &out,
3430 const poplar::DebugContext &debugContext = {},
3431 const poplar::OptionFlags &options = {}) {
3432 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
3433
3434 mapWithOutput(graph, expr::BinaryOpType::LOGICAL_AND, A, B, out, prog, {di},
3435 options);
3436}
3437
3438template <typename constType>
3439inline void logicalAndWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
3440 const constType B, const poplar::Tensor &out,
3442 const poplar::DebugContext &debugContext = {},
3443 const poplar::OptionFlags &options = {}) {
3444 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
3445
3446 checkTypes(A.elementType(), B);
3447 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
3448 graph.setTileMapping(BTensor, 0);
3449 mapWithOutput(graph, expr::BinaryOpType::LOGICAL_AND, A, BTensor, out, prog,
3450 {di}, options);
3451}
3452
3453template <typename constType>
3454inline void logicalAndWithOutput(poplar::Graph &graph, const constType A,
3455 const poplar::Tensor &B,
3456 const poplar::Tensor &out,
3458 const poplar::DebugContext &debugContext = {},
3459 const poplar::OptionFlags &options = {}) {
3460 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
3461
3462 checkTypes(B.elementType(), A);
3463 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
3464 graph.setTileMapping(ATensor, 0);
3465 mapWithOutput(graph, expr::BinaryOpType::LOGICAL_AND, ATensor, B, out, prog,
3466 {di}, options);
3467}
3488 const poplar::Tensor &B,
3490 const poplar::DebugContext &debugContext = {},
3491 const poplar::OptionFlags &options = {}) {
3492 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
3493
3494 auto output =
3495 map(graph, expr::BinaryOpType::LOGICAL_OR, A, B, prog, {di}, options);
3496 di.addOutput(output);
3497 return output;
3498}
3499
3500template <typename constType>
3502 const constType B,
3504 const poplar::DebugContext &debugContext = {},
3505 const poplar::OptionFlags &options = {}) {
3506 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
3507
3508 checkTypes(A.elementType(), B);
3509 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
3510 graph.setTileMapping(BTensor, 0);
3511 auto output = map(graph, expr::BinaryOpType::LOGICAL_OR, A, BTensor, prog,
3512 {di}, options);
3513 di.addOutput(output);
3514 return output;
3515}
3516
3517template <typename constType>
3518inline poplar::Tensor logicalOr(poplar::Graph &graph, const constType A,
3519 const poplar::Tensor &B,
3521 const poplar::DebugContext &debugContext = {},
3522 const poplar::OptionFlags &options = {}) {
3523 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
3524
3525 checkTypes(B.elementType(), A);
3526 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
3527 graph.setTileMapping(ATensor, 0);
3528 auto output = map(graph, expr::BinaryOpType::LOGICAL_OR, ATensor, B, prog,
3529 {di}, options);
3530 di.addOutput(output);
3531 return output;
3532}
3539inline void logicalOrInPlace(poplar::Graph &graph, const poplar::Tensor &A,
3540 const poplar::Tensor &B,
3542 const poplar::DebugContext &debugContext = {},
3543 const poplar::OptionFlags &options = {}) {
3544 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
3545
3546 mapInPlace(graph, expr::BinaryOpType::LOGICAL_OR, A, B, prog, {di}, options);
3547}
3548
3549template <typename constType>
3550inline void logicalOrInPlace(poplar::Graph &graph, const poplar::Tensor &A,
3551 const constType B, poplar::program::Sequence &prog,
3552 const poplar::DebugContext &debugContext = {},
3553 const poplar::OptionFlags &options = {}) {
3554 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
3555
3556 checkTypes(A.elementType(), B);
3557 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
3558 graph.setTileMapping(BTensor, 0);
3559 mapInPlace(graph, expr::BinaryOpType::LOGICAL_OR, A, BTensor, prog, {di},
3560 options);
3561}
3569 const poplar::Tensor &B,
3570 const poplar::Tensor &out,
3572 const poplar::DebugContext &debugContext = {},
3573 const poplar::OptionFlags &options = {}) {
3574 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
3575
3576 mapWithOutput(graph, expr::BinaryOpType::LOGICAL_OR, A, B, out, prog, {di},
3577 options);
3578}
3579
3580template <typename constType>
3581inline void logicalOrWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
3582 const constType B, const poplar::Tensor &out,
3584 const poplar::DebugContext &debugContext = {},
3585 const poplar::OptionFlags &options = {}) {
3586 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
3587
3588 checkTypes(A.elementType(), B);
3589 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
3590 graph.setTileMapping(BTensor, 0);
3591 mapWithOutput(graph, expr::BinaryOpType::LOGICAL_OR, A, BTensor, out, prog,
3592 {di}, options);
3593}
3594
3595template <typename constType>
3596inline void logicalOrWithOutput(poplar::Graph &graph, const constType A,
3597 const poplar::Tensor &B,
3598 const poplar::Tensor &out,
3600 const poplar::DebugContext &debugContext = {},
3601 const poplar::OptionFlags &options = {}) {
3602 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
3603
3604 checkTypes(B.elementType(), A);
3605 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
3606 graph.setTileMapping(ATensor, 0);
3607 mapWithOutput(graph, expr::BinaryOpType::LOGICAL_OR, ATensor, B, out, prog,
3608 {di}, options);
3609}
3630 const poplar::Tensor &B,
3632 const poplar::DebugContext &debugContext = {},
3633 const poplar::OptionFlags &options = {}) {
3634 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
3635
3636 auto output =
3637 map(graph, expr::BinaryOpType::LESS_THAN, A, B, prog, {di}, options);
3638 di.addOutput(output);
3639 return output;
3640}
3641
3642template <typename constType>
3643inline poplar::Tensor lt(poplar::Graph &graph, const poplar::Tensor &A,
3644 const constType B, poplar::program::Sequence &prog,
3645 const poplar::DebugContext &debugContext = {},
3646 const poplar::OptionFlags &options = {}) {
3647 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
3648
3649 checkTypes(A.elementType(), B);
3650 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
3651 graph.setTileMapping(BTensor, 0);
3652 auto output = map(graph, expr::BinaryOpType::LESS_THAN, A, BTensor, prog,
3653 {di}, options);
3654 di.addOutput(output);
3655 return output;
3656}
3657
3658template <typename constType>
3659inline poplar::Tensor lt(poplar::Graph &graph, const constType A,
3660 const poplar::Tensor &B,
3662 const poplar::DebugContext &debugContext = {},
3663 const poplar::OptionFlags &options = {}) {
3664 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
3665
3666 checkTypes(B.elementType(), A);
3667 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
3668 graph.setTileMapping(ATensor, 0);
3669 auto output = map(graph, expr::BinaryOpType::LESS_THAN, ATensor, B, prog,
3670 {di}, options);
3671 di.addOutput(output);
3672 return output;
3673}
3680inline void ltInPlace(poplar::Graph &graph, const poplar::Tensor &A,
3682 const poplar::DebugContext &debugContext = {},
3683 const poplar::OptionFlags &options = {}) {
3684 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
3685
3686 mapInPlace(graph, expr::BinaryOpType::LESS_THAN, A, B, prog, {di}, options);
3687}
3688
3689template <typename constType>
3690inline void ltInPlace(poplar::Graph &graph, const poplar::Tensor &A,
3691 const constType B, poplar::program::Sequence &prog,
3692 const poplar::DebugContext &debugContext = {},
3693 const poplar::OptionFlags &options = {}) {
3694 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
3695
3696 checkTypes(A.elementType(), B);
3697 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
3698 graph.setTileMapping(BTensor, 0);
3699 mapInPlace(graph, expr::BinaryOpType::LESS_THAN, A, BTensor, prog, {di},
3700 options);
3701}
3708inline void ltWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
3709 const poplar::Tensor &B, const poplar::Tensor &out,
3711 const poplar::DebugContext &debugContext = {},
3712 const poplar::OptionFlags &options = {}) {
3713 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
3714
3715 mapWithOutput(graph, expr::BinaryOpType::LESS_THAN, A, B, out, prog, {di},
3716 options);
3717}
3718
3719template <typename constType>
3720inline void ltWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
3721 const constType B, const poplar::Tensor &out,
3723 const poplar::DebugContext &debugContext = {},
3724 const poplar::OptionFlags &options = {}) {
3725 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
3726
3727 checkTypes(A.elementType(), B);
3728 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
3729 graph.setTileMapping(BTensor, 0);
3730 mapWithOutput(graph, expr::BinaryOpType::LESS_THAN, A, BTensor, out, prog,
3731 {di}, options);
3732}
3733
3734template <typename constType>
3735inline void ltWithOutput(poplar::Graph &graph, const constType A,
3736 const poplar::Tensor &B, const poplar::Tensor &out,
3738 const poplar::DebugContext &debugContext = {},
3739 const poplar::OptionFlags &options = {}) {
3740 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
3741
3742 checkTypes(B.elementType(), A);
3743 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
3744 graph.setTileMapping(ATensor, 0);
3745 mapWithOutput(graph, expr::BinaryOpType::LESS_THAN, ATensor, B, out, prog,
3746 {di}, options);
3747}
3768 const poplar::Tensor &B,
3770 const poplar::DebugContext &debugContext = {},
3771 const poplar::OptionFlags &options = {}) {
3772 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
3773
3774 auto output =
3775 map(graph, expr::BinaryOpType::MAXIMUM, A, B, prog, {di}, options);
3776 di.addOutput(output);
3777 return output;
3778}
3779
3780template <typename constType>
3781inline poplar::Tensor max(poplar::Graph &graph, const poplar::Tensor &A,
3782 const constType B, poplar::program::Sequence &prog,
3783 const poplar::DebugContext &debugContext = {},
3784 const poplar::OptionFlags &options = {}) {
3785 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
3786
3787 checkTypes(A.elementType(), B);
3788 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
3789 graph.setTileMapping(BTensor, 0);
3790 auto output =
3791 map(graph, expr::BinaryOpType::MAXIMUM, A, BTensor, prog, {di}, options);
3792 di.addOutput(output);
3793 return output;
3794}
3795
3796template <typename constType>
3797inline poplar::Tensor max(poplar::Graph &graph, const constType A,
3798 const poplar::Tensor &B,
3800 const poplar::DebugContext &debugContext = {},
3801 const poplar::OptionFlags &options = {}) {
3802 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
3803
3804 checkTypes(B.elementType(), A);
3805 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
3806 graph.setTileMapping(ATensor, 0);
3807 auto output =
3808 map(graph, expr::BinaryOpType::MAXIMUM, ATensor, B, prog, {di}, options);
3809 di.addOutput(output);
3810 return output;
3811}
3818inline void maxInPlace(poplar::Graph &graph, const poplar::Tensor &A,
3820 const poplar::DebugContext &debugContext = {},
3821 const poplar::OptionFlags &options = {}) {
3822 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
3823
3824 mapInPlace(graph, expr::BinaryOpType::MAXIMUM, A, B, prog, {di}, options);
3825}
3826
3827template <typename constType>
3828inline void maxInPlace(poplar::Graph &graph, const poplar::Tensor &A,
3829 const constType B, poplar::program::Sequence &prog,
3830 const poplar::DebugContext &debugContext = {},
3831 const poplar::OptionFlags &options = {}) {
3832 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
3833
3834 checkTypes(A.elementType(), B);
3835 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
3836 graph.setTileMapping(BTensor, 0);
3837 mapInPlace(graph, expr::BinaryOpType::MAXIMUM, A, BTensor, prog, {di},
3838 options);
3839}
3846inline void maxWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
3847 const poplar::Tensor &B, const poplar::Tensor &out,
3849 const poplar::DebugContext &debugContext = {},
3850 const poplar::OptionFlags &options = {}) {
3851 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
3852
3853 mapWithOutput(graph, expr::BinaryOpType::MAXIMUM, A, B, out, prog, {di},
3854 options);
3855}
3856
3857template <typename constType>
3858inline void maxWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
3859 const constType B, const poplar::Tensor &out,
3861 const poplar::DebugContext &debugContext = {},
3862 const poplar::OptionFlags &options = {}) {
3863 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
3864
3865 checkTypes(A.elementType(), B);
3866 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
3867 graph.setTileMapping(BTensor, 0);
3868 mapWithOutput(graph, expr::BinaryOpType::MAXIMUM, A, BTensor, out, prog, {di},
3869 options);
3870}
3871
3872template <typename constType>
3873inline void maxWithOutput(poplar::Graph &graph, const constType A,
3874 const poplar::Tensor &B, const poplar::Tensor &out,
3876 const poplar::DebugContext &debugContext = {},
3877 const poplar::OptionFlags &options = {}) {
3878 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
3879
3880 checkTypes(B.elementType(), A);
3881 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
3882 graph.setTileMapping(ATensor, 0);
3883 mapWithOutput(graph, expr::BinaryOpType::MAXIMUM, ATensor, B, out, prog, {di},
3884 options);
3885}
3906 const poplar::Tensor &B,
3908 const poplar::DebugContext &debugContext = {},
3909 const poplar::OptionFlags &options = {}) {
3910 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
3911
3912 auto output =
3913 map(graph, expr::BinaryOpType::MINIMUM, A, B, prog, {di}, options);
3914 di.addOutput(output);
3915 return output;
3916}
3917
3918template <typename constType>
3919inline poplar::Tensor min(poplar::Graph &graph, const poplar::Tensor &A,
3920 const constType B, poplar::program::Sequence &prog,
3921 const poplar::DebugContext &debugContext = {},
3922 const poplar::OptionFlags &options = {}) {
3923 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
3924
3925 checkTypes(A.elementType(), B);
3926 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
3927 graph.setTileMapping(BTensor, 0);
3928 auto output =
3929 map(graph, expr::BinaryOpType::MINIMUM, A, BTensor, prog, {di}, options);
3930 di.addOutput(output);
3931 return output;
3932}
3933
3934template <typename constType>
3935inline poplar::Tensor min(poplar::Graph &graph, const constType A,
3936 const poplar::Tensor &B,
3938 const poplar::DebugContext &debugContext = {},
3939 const poplar::OptionFlags &options = {}) {
3940 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
3941
3942 checkTypes(B.elementType(), A);
3943 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
3944 graph.setTileMapping(ATensor, 0);
3945 auto output =
3946 map(graph, expr::BinaryOpType::MINIMUM, ATensor, B, prog, {di}, options);
3947 di.addOutput(output);
3948 return output;
3949}
3956inline void minInPlace(poplar::Graph &graph, const poplar::Tensor &A,
3958 const poplar::DebugContext &debugContext = {},
3959 const poplar::OptionFlags &options = {}) {
3960 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
3961
3962 mapInPlace(graph, expr::BinaryOpType::MINIMUM, A, B, prog, {di}, options);
3963}
3964
3965template <typename constType>
3966inline void minInPlace(poplar::Graph &graph, const poplar::Tensor &A,
3967 const constType B, poplar::program::Sequence &prog,
3968 const poplar::DebugContext &debugContext = {},
3969 const poplar::OptionFlags &options = {}) {
3970 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
3971
3972 checkTypes(A.elementType(), B);
3973 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
3974 graph.setTileMapping(BTensor, 0);
3975 mapInPlace(graph, expr::BinaryOpType::MINIMUM, A, BTensor, prog, {di},
3976 options);
3977}
3984inline void minWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
3985 const poplar::Tensor &B, const poplar::Tensor &out,
3987 const poplar::DebugContext &debugContext = {},
3988 const poplar::OptionFlags &options = {}) {
3989 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
3990
3991 mapWithOutput(graph, expr::BinaryOpType::MINIMUM, A, B, out, prog, {di},
3992 options);
3993}
3994
3995template <typename constType>
3996inline void minWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
3997 const constType B, const poplar::Tensor &out,
3999 const poplar::DebugContext &debugContext = {},
4000 const poplar::OptionFlags &options = {}) {
4001 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
4002
4003 checkTypes(A.elementType(), B);
4004 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
4005 graph.setTileMapping(BTensor, 0);
4006 mapWithOutput(graph, expr::BinaryOpType::MINIMUM, A, BTensor, out, prog, {di},
4007 options);
4008}
4009
4010template <typename constType>
4011inline void minWithOutoput(poplar::Graph &graph, const constType A,
4012 const poplar::Tensor &B, const poplar::Tensor &out,
4014 const poplar::DebugContext &debugContext = {},
4015 const poplar::OptionFlags &options = {}) {
4016 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
4017
4018 checkTypes(B.elementType(), A);
4019 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
4020 graph.setTileMapping(ATensor, 0);
4021 mapWithOutput(graph, expr::BinaryOpType::MINIMUM, ATensor, B, out, prog, {di},
4022 options);
4023}
4043 const poplar::Tensor &B,
4045 const poplar::DebugContext &debugContext = {},
4046 const poplar::OptionFlags &options = {}) {
4047 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
4048
4049 auto output =
4050 map(graph, expr::BinaryOpType::MULTIPLY, A, B, prog, {di}, options);
4051 di.addOutput(output);
4052 return output;
4053}
4054
4055template <typename constType>
4056inline poplar::Tensor mul(poplar::Graph &graph, const poplar::Tensor &A,
4057 const constType B, poplar::program::Sequence &prog,
4058 const poplar::DebugContext &debugContext = {},
4059 const poplar::OptionFlags &options = {}) {
4060 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
4061
4062 checkTypes(A.elementType(), B);
4063 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
4064 graph.setTileMapping(BTensor, 0);
4065 auto output =
4066 map(graph, expr::BinaryOpType::MULTIPLY, A, BTensor, prog, {di}, options);
4067 di.addOutput(output);
4068 return output;
4069}
4070
4071template <typename constType>
4072inline poplar::Tensor mul(poplar::Graph &graph, const constType A,
4073 const poplar::Tensor &B,
4075 const poplar::DebugContext &debugContext = {},
4076 const poplar::OptionFlags &options = {}) {
4077 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
4078
4079 checkTypes(B.elementType(), A);
4080 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
4081 graph.setTileMapping(ATensor, 0);
4082 auto output =
4083 map(graph, expr::BinaryOpType::MULTIPLY, ATensor, B, prog, {di}, options);
4084 di.addOutput(output);
4085 return output;
4086}
4093inline void mulInPlace(poplar::Graph &graph, const poplar::Tensor &A,
4095 const poplar::DebugContext &debugContext = {},
4096 const poplar::OptionFlags &options = {}) {
4097 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
4098
4099 mapInPlace(graph, expr::BinaryOpType::MULTIPLY, A, B, prog, {di}, options);
4100}
4101
4102template <typename constType>
4103inline void mulInPlace(poplar::Graph &graph, const poplar::Tensor &A,
4104 const constType B, poplar::program::Sequence &prog,
4105 const poplar::DebugContext &debugContext = {},
4106 const poplar::OptionFlags &options = {}) {
4107 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
4108
4109 checkTypes(A.elementType(), B);
4110 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
4111 graph.setTileMapping(BTensor, 0);
4112 mapInPlace(graph, expr::BinaryOpType::MULTIPLY, A, BTensor, prog, {di},
4113 options);
4114}
4121inline void mulWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
4122 const poplar::Tensor &B, const poplar::Tensor &out,
4124 const poplar::DebugContext &debugContext = {},
4125 const poplar::OptionFlags &options = {}) {
4126 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
4127
4128 mapWithOutput(graph, expr::BinaryOpType::MULTIPLY, A, B, out, prog, {di},
4129 options);
4130}
4131
4132template <typename constType>
4133inline void mulWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
4134 const constType B, const poplar::Tensor &out,
4136 const poplar::DebugContext &debugContext = {},
4137 const poplar::OptionFlags &options = {}) {
4138 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
4139
4140 checkTypes(A.elementType(), B);
4141 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
4142 graph.setTileMapping(BTensor, 0);
4143 mapWithOutput(graph, expr::BinaryOpType::MULTIPLY, A, BTensor, out, prog,
4144 {di}, options);
4145}
4146
4147template <typename constType>
4148inline void mulWithOutput(poplar::Graph &graph, const constType A,
4149 const poplar::Tensor &B, const poplar::Tensor &out,
4151 const poplar::DebugContext &debugContext = {},
4152 const poplar::OptionFlags &options = {}) {
4153 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
4154
4155 checkTypes(B.elementType(), A);
4156 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
4157 graph.setTileMapping(ATensor, 0);
4158 mapWithOutput(graph, expr::BinaryOpType::MULTIPLY, ATensor, B, out, prog,
4159 {di}, options);
4160}
4181 const poplar::Tensor &B,
4183 const poplar::DebugContext &debugContext = {},
4184 const poplar::OptionFlags &options = {}) {
4185 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
4186
4187 auto output =
4188 map(graph, expr::BinaryOpType::NOT_EQUAL, A, B, prog, {di}, options);
4189 di.addOutput(output);
4190 return output;
4191}
4192
4193template <typename constType>
4194inline poplar::Tensor neq(poplar::Graph &graph, const poplar::Tensor &A,
4195 const constType B, poplar::program::Sequence &prog,
4196 const poplar::DebugContext &debugContext = {},
4197 const poplar::OptionFlags &options = {}) {
4198 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
4199
4200 checkTypes(A.elementType(), B);
4201 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
4202 graph.setTileMapping(BTensor, 0);
4203 auto output = map(graph, expr::BinaryOpType::NOT_EQUAL, A, BTensor, prog,
4204 {di}, options);
4205 di.addOutput(output);
4206 return output;
4207}
4208
4209template <typename constType>
4210inline poplar::Tensor neq(poplar::Graph &graph, const constType A,
4211 const poplar::Tensor &B,
4213 const poplar::DebugContext &debugContext = {},
4214 const poplar::OptionFlags &options = {}) {
4215 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
4216
4217 checkTypes(B.elementType(), A);
4218 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
4219 graph.setTileMapping(ATensor, 0);
4220 auto output = map(graph, expr::BinaryOpType::NOT_EQUAL, ATensor, B, prog,
4221 {di}, options);
4222 di.addOutput(output);
4223 return output;
4224}
4231inline void neqInPlace(poplar::Graph &graph, const poplar::Tensor &A,
4233 const poplar::DebugContext &debugContext = {},
4234 const poplar::OptionFlags &options = {}) {
4235 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
4236
4237 mapInPlace(graph, expr::BinaryOpType::NOT_EQUAL, A, B, prog, {di}, options);
4238}
4239
4240template <typename constType>
4241inline void neqInPlace(poplar::Graph &graph, const poplar::Tensor &A,
4242 const constType B, poplar::program::Sequence &prog,
4243 const poplar::DebugContext &debugContext = {},
4244 const poplar::OptionFlags &options = {}) {
4245 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
4246
4247 checkTypes(A.elementType(), B);
4248 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
4249 graph.setTileMapping(BTensor, 0);
4250 mapInPlace(graph, expr::BinaryOpType::NOT_EQUAL, A, BTensor, prog, {di},
4251 options);
4252}
4259inline void neqWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
4260 const poplar::Tensor &B, const poplar::Tensor &out,
4262 const poplar::DebugContext &debugContext = {},
4263 const poplar::OptionFlags &options = {}) {
4264 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
4265
4266 mapWithOutput(graph, expr::BinaryOpType::NOT_EQUAL, A, B, out, prog, {di},
4267 options);
4268}
4269
4270template <typename constType>
4271inline void neqWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
4272 const constType B, const poplar::Tensor &out,
4274 const poplar::DebugContext &debugContext = {},
4275 const poplar::OptionFlags &options = {}) {
4276 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
4277
4278 checkTypes(A.elementType(), B);
4279 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
4280 graph.setTileMapping(BTensor, 0);
4281 mapWithOutput(graph, expr::BinaryOpType::NOT_EQUAL, A, BTensor, out, prog,
4282 {di}, options);
4283}
4284
4285template <typename constType>
4286inline void neqWithOutput(poplar::Graph &graph, const constType A,
4287 const poplar::Tensor &B, const poplar::Tensor &out,
4289 const poplar::DebugContext &debugContext = {},
4290 const poplar::OptionFlags &options = {}) {
4291 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
4292
4293 checkTypes(B.elementType(), A);
4294 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
4295 graph.setTileMapping(ATensor, 0);
4296 mapWithOutput(graph, expr::BinaryOpType::NOT_EQUAL, ATensor, B, out, prog,
4297 {di}, options);
4298}
4318 const poplar::Tensor &B,
4320 const poplar::DebugContext &debugContext = {},
4321 const poplar::OptionFlags &options = {}) {
4322 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
4323
4324 auto output =
4325 map(graph, expr::BinaryOpType::POWER, A, B, prog, {di}, options);
4326 di.addOutput(output);
4327 return output;
4328}
4329
4330template <typename constType>
4331inline poplar::Tensor pow(poplar::Graph &graph, const poplar::Tensor &A,
4332 const constType B, poplar::program::Sequence &prog,
4333 const poplar::DebugContext &debugContext = {},
4334 const poplar::OptionFlags &options = {}) {
4335 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
4336
4337 checkTypes(A.elementType(), B);
4338 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
4339 graph.setTileMapping(BTensor, 0);
4340 auto output =
4341 map(graph, expr::BinaryOpType::POWER, A, BTensor, prog, {di}, options);
4342 di.addOutput(output);
4343 return output;
4344}
4345
4346template <typename constType>
4347inline poplar::Tensor pow(poplar::Graph &graph, const constType A,
4348 const poplar::Tensor &B,
4350 const poplar::DebugContext &debugContext = {},
4351 const poplar::OptionFlags &options = {}) {
4352 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
4353
4354 checkTypes(B.elementType(), A);
4355 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
4356 graph.setTileMapping(ATensor, 0);
4357 auto output =
4358 map(graph, expr::BinaryOpType::POWER, ATensor, B, prog, {di}, options);
4359 di.addOutput(output);
4360 return output;
4361}
4368inline void powInPlace(poplar::Graph &graph, const poplar::Tensor &A,
4370 const poplar::DebugContext &debugContext = {},
4371 const poplar::OptionFlags &options = {}) {
4372 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
4373
4374 mapInPlace(graph, expr::BinaryOpType::POWER, A, B, prog, {di}, options);
4375}
4376
4377template <typename constType>
4378inline void powInPlace(poplar::Graph &graph, const poplar::Tensor &A,
4379 const constType B, poplar::program::Sequence &prog,
4380 const poplar::DebugContext &debugContext = {},
4381 const poplar::OptionFlags &options = {}) {
4382 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
4383
4384 checkTypes(A.elementType(), B);
4385 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
4386 graph.setTileMapping(BTensor, 0);
4387 mapInPlace(graph, expr::BinaryOpType::POWER, A, BTensor, prog, {di}, options);
4388}
4395inline void powWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
4396 const poplar::Tensor &B, const poplar::Tensor &out,
4398 const poplar::DebugContext &debugContext = {},
4399 const poplar::OptionFlags &options = {}) {
4400 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
4401
4402 mapWithOutput(graph, expr::BinaryOpType::POWER, A, B, out, prog, {di},
4403 options);
4404}
4405
4406template <typename constType>
4407inline void powWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
4408 const constType B, const poplar::Tensor &out,
4410 const poplar::DebugContext &debugContext = {},
4411 const poplar::OptionFlags &options = {}) {
4412 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
4413
4414 checkTypes(A.elementType(), B);
4415 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
4416 graph.setTileMapping(BTensor, 0);
4417 mapWithOutput(graph, expr::BinaryOpType::POWER, A, BTensor, out, prog, {di},
4418 options);
4419}
4420
4421template <typename constType>
4422inline void powWithOutput(poplar::Graph &graph, const constType A,
4423 const poplar::Tensor &B, const poplar::Tensor &out,
4425 const poplar::DebugContext &debugContext = {},
4426 const poplar::OptionFlags &options = {}) {
4427 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
4428
4429 checkTypes(B.elementType(), A);
4430 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
4431 graph.setTileMapping(ATensor, 0);
4432 mapWithOutput(graph, expr::BinaryOpType::POWER, ATensor, B, out, prog, {di},
4433 options);
4434}
4454 const poplar::Tensor &B,
4456 const poplar::DebugContext &debugContext = {},
4457 const poplar::OptionFlags &options = {}) {
4458 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
4459
4460 auto output =
4461 map(graph, expr::BinaryOpType::REMAINDER, A, B, prog, {di}, options);
4462 di.addOutput(output);
4463 return output;
4464}
4465
4466template <typename constType>
4467inline poplar::Tensor rem(poplar::Graph &graph, const poplar::Tensor &A,
4468 const constType B, poplar::program::Sequence &prog,
4469 const poplar::DebugContext &debugContext = {},
4470 const poplar::OptionFlags &options = {}) {
4471 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
4472
4473 checkTypes(A.elementType(), B);
4474 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
4475 graph.setTileMapping(BTensor, 0);
4476 auto output = map(graph, expr::BinaryOpType::REMAINDER, A, BTensor, prog,
4477 {di}, options);
4478 di.addOutput(output);
4479 return output;
4480}
4481
4482template <typename constType>
4483inline poplar::Tensor rem(poplar::Graph &graph, const constType A,
4484 const poplar::Tensor &B,
4486 const poplar::DebugContext &debugContext = {},
4487 const poplar::OptionFlags &options = {}) {
4488 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
4489
4490 checkTypes(B.elementType(), A);
4491 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
4492 graph.setTileMapping(ATensor, 0);
4493 auto output = map(graph, expr::BinaryOpType::REMAINDER, ATensor, B, prog,
4494 {di}, options);
4495 di.addOutput(output);
4496 return output;
4497}
4504inline void remInPlace(poplar::Graph &graph, const poplar::Tensor &A,
4506 const poplar::DebugContext &debugContext = {},
4507 const poplar::OptionFlags &options = {}) {
4508 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
4509
4510 mapInPlace(graph, expr::BinaryOpType::REMAINDER, A, B, prog, {di}, options);
4511}
4512
4513template <typename constType>
4514inline void remInPlace(poplar::Graph &graph, const poplar::Tensor &A,
4515 const constType B, poplar::program::Sequence &prog,
4516 const poplar::DebugContext &debugContext = {},
4517 const poplar::OptionFlags &options = {}) {
4518 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
4519
4520 checkTypes(A.elementType(), B);
4521 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
4522 graph.setTileMapping(BTensor, 0);
4523 mapInPlace(graph, expr::BinaryOpType::REMAINDER, A, BTensor, prog, {di},
4524 options);
4525}
4532inline void remWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
4533 const poplar::Tensor &B, const poplar::Tensor &out,
4535 const poplar::DebugContext &debugContext = {},
4536 const poplar::OptionFlags &options = {}) {
4537 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
4538
4539 mapWithOutput(graph, expr::BinaryOpType::REMAINDER, A, B, out, prog, {di},
4540 options);
4541}
4542
4543template <typename constType>
4544inline void remWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
4545 const constType B, const poplar::Tensor &out,
4547 const poplar::DebugContext &debugContext = {},
4548 const poplar::OptionFlags &options = {}) {
4549 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
4550
4551 checkTypes(A.elementType(), B);
4552 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
4553 graph.setTileMapping(BTensor, 0);
4554 mapWithOutput(graph, expr::BinaryOpType::REMAINDER, A, BTensor, out, prog,
4555 {di}, options);
4556}
4557
4558template <typename constType>
4559inline void remWithOutput(poplar::Graph &graph, const constType A,
4560 const poplar::Tensor &B, const poplar::Tensor &out,
4562 const poplar::DebugContext &debugContext = {},
4563 const poplar::OptionFlags &options = {}) {
4564 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
4565
4566 checkTypes(B.elementType(), A);
4567 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
4568 graph.setTileMapping(ATensor, 0);
4569 mapWithOutput(graph, expr::BinaryOpType::REMAINDER, ATensor, B, out, prog,
4570 {di}, options);
4571}
4591 const poplar::Tensor &B,
4593 const poplar::DebugContext &debugContext = {},
4594 const poplar::OptionFlags &options = {}) {
4595 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
4596
4597 auto output =
4598 map(graph, expr::BinaryOpType::SHIFT_LEFT, A, B, prog, {di}, options);
4599 di.addOutput(output);
4600 return output;
4601}
4602
4603template <typename constType>
4605 const constType B,
4607 const poplar::DebugContext &debugContext = {},
4608 const poplar::OptionFlags &options = {}) {
4609 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
4610
4611 checkTypes(A.elementType(), B);
4612 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
4613 graph.setTileMapping(BTensor, 0);
4614 auto output = map(graph, expr::BinaryOpType::SHIFT_LEFT, A, BTensor, prog,
4615 {di}, options);
4616 di.addOutput(output);
4617 return output;
4618}
4619
4620template <typename constType>
4621inline poplar::Tensor shiftLeft(poplar::Graph &graph, const constType A,
4622 const poplar::Tensor &B,
4624 const poplar::DebugContext &debugContext = {},
4625 const poplar::OptionFlags &options = {}) {
4626 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
4627
4628 checkTypes(B.elementType(), A);
4629 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
4630 graph.setTileMapping(ATensor, 0);
4631 auto output = map(graph, expr::BinaryOpType::SHIFT_LEFT, ATensor, B, prog,
4632 {di}, options);
4633 di.addOutput(output);
4634 return output;
4635}
4642inline void shiftLeftInPlace(poplar::Graph &graph, const poplar::Tensor &A,
4643 const poplar::Tensor &B,
4645 const poplar::DebugContext &debugContext = {},
4646 const poplar::OptionFlags &options = {}) {
4647 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
4648
4649 mapInPlace(graph, expr::BinaryOpType::SHIFT_LEFT, A, B, prog, {di}, options);
4650}
4651
4652template <typename constType>
4653inline void shiftLeftInPlace(poplar::Graph &graph, const poplar::Tensor &A,
4654 const constType B, poplar::program::Sequence &prog,
4655 const poplar::DebugContext &debugContext = {},
4656 const poplar::OptionFlags &options = {}) {
4657 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
4658
4659 checkTypes(A.elementType(), B);
4660 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
4661 graph.setTileMapping(BTensor, 0);
4662 mapInPlace(graph, expr::BinaryOpType::SHIFT_LEFT, A, BTensor, prog, {di},
4663 options);
4664}
4672 const poplar::Tensor &B,
4673 const poplar::Tensor &out,
4675 const poplar::DebugContext &debugContext = {},
4676 const poplar::OptionFlags &options = {}) {
4677 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
4678
4679 mapWithOutput(graph, expr::BinaryOpType::SHIFT_LEFT, A, B, out, prog, {di},
4680 options);
4681}
4682
4683template <typename constType>
4684inline void shiftLeftWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
4685 const constType B, const poplar::Tensor &out,
4687 const poplar::DebugContext &debugContext = {},
4688 const poplar::OptionFlags &options = {}) {
4689 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
4690
4691 checkTypes(A.elementType(), B);
4692 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
4693 graph.setTileMapping(BTensor, 0);
4694 mapWithOutput(graph, expr::BinaryOpType::SHIFT_LEFT, A, BTensor, out, prog,
4695 {di}, options);
4696}
4697
4698template <typename constType>
4699inline void shiftLeftWithOutput(poplar::Graph &graph, const constType A,
4700 const poplar::Tensor &B,
4701 const poplar::Tensor &out,
4703 const poplar::DebugContext &debugContext = {},
4704 const poplar::OptionFlags &options = {}) {
4705 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
4706
4707 checkTypes(B.elementType(), A);
4708 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
4709 graph.setTileMapping(ATensor, 0);
4710 mapWithOutput(graph, expr::BinaryOpType::SHIFT_LEFT, ATensor, B, out, prog,
4711 {di}, options);
4712}
4733 const poplar::Tensor &B,
4735 const poplar::DebugContext &debugContext = {},
4736 const poplar::OptionFlags &options = {}) {
4737 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
4738
4739 auto output =
4740 map(graph, expr::BinaryOpType::SHIFT_RIGHT, A, B, prog, {di}, options);
4741 di.addOutput(output);
4742 return output;
4743}
4744
4745template <typename constType>
4747 const constType B,
4749 const poplar::DebugContext &debugContext = {},
4750 const poplar::OptionFlags &options = {}) {
4751 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
4752
4753 checkTypes(A.elementType(), B);
4754 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
4755 graph.setTileMapping(BTensor, 0);
4756 auto output = map(graph, expr::BinaryOpType::SHIFT_RIGHT, A, BTensor, prog,
4757 {di}, options);
4758 di.addOutput(output);
4759 return output;
4760}
4761
4762template <typename constType>
4763inline poplar::Tensor shiftRight(poplar::Graph &graph, const constType A,
4764 const poplar::Tensor &B,
4766 const poplar::DebugContext &debugContext = {},
4767 const poplar::OptionFlags &options = {}) {
4768 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
4769
4770 checkTypes(B.elementType(), A);
4771 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
4772 graph.setTileMapping(ATensor, 0);
4773 auto output = map(graph, expr::BinaryOpType::SHIFT_RIGHT, ATensor, B, prog,
4774 {di}, options);
4775 di.addOutput(output);
4776 return output;
4777}
4785 const poplar::Tensor &B,
4787 const poplar::DebugContext &debugContext = {},
4788 const poplar::OptionFlags &options = {}) {
4789 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
4790
4791 mapInPlace(graph, expr::BinaryOpType::SHIFT_RIGHT, A, B, prog, {di}, options);
4792}
4793
4794template <typename constType>
4795inline void shiftRightInPlace(poplar::Graph &graph, const poplar::Tensor &A,
4796 const constType B,
4798 const poplar::DebugContext &debugContext = {},
4799 const poplar::OptionFlags &options = {}) {
4800 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
4801
4802 checkTypes(A.elementType(), B);
4803 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
4804 graph.setTileMapping(BTensor, 0);
4805 mapInPlace(graph, expr::BinaryOpType::SHIFT_RIGHT, A, BTensor, prog, {di},
4806 options);
4807}
4815 const poplar::Tensor &B,
4816 const poplar::Tensor &out,
4818 const poplar::DebugContext &debugContext = {},
4819 const poplar::OptionFlags &options = {}) {
4820 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
4821
4822 mapWithOutput(graph, expr::BinaryOpType::SHIFT_RIGHT, A, B, out, prog, {di},
4823 options);
4824}
4825
4826template <typename constType>
4827inline void shiftRightWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
4828 const constType B, const poplar::Tensor &out,
4830 const poplar::DebugContext &debugContext = {},
4831 const poplar::OptionFlags &options = {}) {
4832 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
4833
4834 checkTypes(A.elementType(), B);
4835 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
4836 graph.setTileMapping(BTensor, 0);
4837 mapWithOutput(graph, expr::BinaryOpType::SHIFT_RIGHT, A, BTensor, out, prog,
4838 {di}, options);
4839}
4842template <typename constType>
4843inline void shiftRightWithOutput(poplar::Graph &graph, const constType A,
4844 const poplar::Tensor &B,
4845 const poplar::Tensor &out,
4847 const poplar::DebugContext &debugContext = {},
4848 const poplar::OptionFlags &options = {}) {
4849 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
4850
4851 checkTypes(B.elementType(), A);
4852 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
4853 graph.setTileMapping(ATensor, 0);
4854 mapWithOutput(graph, expr::BinaryOpType::SHIFT_RIGHT, ATensor, B, out, prog,
4855 {di}, options);
4856}
4857
4876inline poplar::Tensor
4879 const poplar::DebugContext &debugContext = {},
4880 const poplar::OptionFlags &options = {}) {
4881 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
4882
4883 auto output = map(graph, expr::BinaryOpType::SHIFT_RIGHT_SIGN_EXTEND, A, B,
4884 prog, {di}, options);
4885 di.addOutput(output);
4886 return output;
4887}
4888
4889template <typename constType>
4890inline poplar::Tensor
4892 const constType B, poplar::program::Sequence &prog,
4893 const poplar::DebugContext &debugContext = {},
4894 const poplar::OptionFlags &options = {}) {
4895 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
4896
4897 checkTypes(A.elementType(), B);
4898 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
4899 graph.setTileMapping(BTensor, 0);
4900 auto output = map(graph, expr::BinaryOpType::SHIFT_RIGHT_SIGN_EXTEND, A,
4901 BTensor, prog, {di}, options);
4902 di.addOutput(output);
4903 return output;
4904}
4905
4906template <typename constType>
4907inline poplar::Tensor
4908shiftRightSignExtend(poplar::Graph &graph, const constType A,
4910 const poplar::DebugContext &debugContext = {},
4911 const poplar::OptionFlags &options = {}) {
4912 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
4913
4914 checkTypes(B.elementType(), A);
4915 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
4916 graph.setTileMapping(ATensor, 0);
4917 auto output = map(graph, expr::BinaryOpType::SHIFT_RIGHT_SIGN_EXTEND, ATensor,
4918 B, prog, {di}, options);
4919 di.addOutput(output);
4920 return output;
4921}
4928inline void
4930 const poplar::Tensor &B,
4932 const poplar::DebugContext &debugContext = {},
4933 const poplar::OptionFlags &options = {}) {
4934 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
4935
4936 mapInPlace(graph, expr::BinaryOpType::SHIFT_RIGHT_SIGN_EXTEND, A, B, prog,
4937 {di}, options);
4938}
4939
4940template <typename constType>
4941inline void
4943 const constType B, poplar::program::Sequence &prog,
4944 const poplar::DebugContext &debugContext = {},
4945 const poplar::OptionFlags &options = {}) {
4946 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
4947
4948 checkTypes(A.elementType(), B);
4949 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
4950 graph.setTileMapping(BTensor, 0);
4951 mapInPlace(graph, expr::BinaryOpType::SHIFT_RIGHT_SIGN_EXTEND, A, BTensor,
4952 prog, {di}, options);
4953}
4961 poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B,
4962 const poplar::Tensor &out, poplar::program::Sequence &prog,
4963 const poplar::DebugContext &debugContext = {},
4964 const poplar::OptionFlags &options = {}) {
4965 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
4966
4967 mapWithOutput(graph, expr::BinaryOpType::SHIFT_RIGHT_SIGN_EXTEND, A, B, out,
4968 prog, {di}, options);
4969}
4970
4971template <typename constType>
4972inline void
4974 const constType B, const poplar::Tensor &out,
4976 const poplar::DebugContext &debugContext = {},
4977 const poplar::OptionFlags &options = {}) {
4978 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
4979
4980 checkTypes(A.elementType(), B);
4981 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
4982 graph.setTileMapping(BTensor, 0);
4983 mapWithOutput(graph, expr::BinaryOpType::SHIFT_RIGHT_SIGN_EXTEND, A, BTensor,
4984 out, prog, {di}, options);
4985}
4986
4987template <typename constType>
4989 poplar::Graph &graph, const constType A, const poplar::Tensor &B,
4990 const poplar::Tensor &out, poplar::program::Sequence &prog,
4991 const poplar::DebugContext &debugContext = {},
4992 const poplar::OptionFlags &options = {}) {
4993 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
4994
4995 checkTypes(B.elementType(), A);
4996 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
4997 graph.setTileMapping(ATensor, 0);
4998 mapWithOutput(graph, expr::BinaryOpType::SHIFT_RIGHT_SIGN_EXTEND, ATensor, B,
4999 out, prog, {di}, options);
5000}
5020 const poplar::Tensor &B,
5022 const poplar::DebugContext &debugContext = {},
5023 const poplar::OptionFlags &options = {}) {
5024 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
5025
5026 auto output =
5027 map(graph, expr::BinaryOpType::SUBTRACT, A, B, prog, {di}, options);
5028 di.addOutput(output);
5029 return output;
5030}
5031
5032template <typename constType>
5033inline poplar::Tensor sub(poplar::Graph &graph, const poplar::Tensor &A,
5034 const constType B, poplar::program::Sequence &prog,
5035 const poplar::DebugContext &debugContext = {},
5036 const poplar::OptionFlags &options = {}) {
5037 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
5038
5039 checkTypes(A.elementType(), B);
5040 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
5041 graph.setTileMapping(BTensor, 0);
5042 auto output =
5043 map(graph, expr::BinaryOpType::SUBTRACT, A, BTensor, prog, {di}, options);
5044 di.addOutput(output);
5045 return output;
5046}
5047
5048template <typename constType>
5049inline poplar::Tensor sub(poplar::Graph &graph, const constType A,
5050 const poplar::Tensor &B,
5052 const poplar::DebugContext &debugContext = {},
5053 const poplar::OptionFlags &options = {}) {
5054 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
5055
5056 checkTypes(B.elementType(), A);
5057 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
5058 graph.setTileMapping(ATensor, 0);
5059 auto output =
5060 map(graph, expr::BinaryOpType::SUBTRACT, ATensor, B, prog, {di}, options);
5061 di.addOutput(output);
5062 return output;
5063}
5070inline void subInPlace(poplar::Graph &graph, const poplar::Tensor &A,
5072 const poplar::DebugContext &debugContext = {},
5073 const poplar::OptionFlags &options = {}) {
5074 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
5075
5076 mapInPlace(graph, expr::BinaryOpType::SUBTRACT, A, B, prog, {di}, options);
5077}
5078
5079template <typename constType>
5080inline void subInPlace(poplar::Graph &graph, const poplar::Tensor &A,
5081 const constType B, poplar::program::Sequence &prog,
5082 const poplar::DebugContext &debugContext = {},
5083 const poplar::OptionFlags &options = {}) {
5084 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
5085
5086 checkTypes(A.elementType(), B);
5087 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
5088 graph.setTileMapping(BTensor, 0);
5089 mapInPlace(graph, expr::BinaryOpType::SUBTRACT, A, BTensor, prog, {di},
5090 options);
5091}
5098inline void subWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
5099 const poplar::Tensor &B, const poplar::Tensor &out,
5101 const poplar::DebugContext &debugContext = {},
5102 const poplar::OptionFlags &options = {}) {
5103 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
5104
5105 mapWithOutput(graph, expr::BinaryOpType::SUBTRACT, A, B, out, prog, {di},
5106 options);
5107}
5108
5109template <typename constType>
5110inline void subWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
5111 const constType B, const poplar::Tensor &out,
5113 const poplar::DebugContext &debugContext = {},
5114 const poplar::OptionFlags &options = {}) {
5115 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
5116
5117 checkTypes(A.elementType(), B);
5118 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
5119 graph.setTileMapping(BTensor, 0);
5120 mapWithOutput(graph, expr::BinaryOpType::SUBTRACT, A, BTensor, out, prog,
5121 {di}, options);
5122}
5123
5124template <typename constType>
5125inline void subWithOutput(poplar::Graph &graph, const constType A,
5126 const poplar::Tensor &B, const poplar::Tensor &out,
5128 const poplar::DebugContext &debugContext = {},
5129 const poplar::OptionFlags &options = {}) {
5130 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
5131
5132 checkTypes(B.elementType(), A);
5133 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
5134 graph.setTileMapping(ATensor, 0);
5135 mapWithOutput(graph, expr::BinaryOpType::SUBTRACT, ATensor, B, out, prog,
5136 {di}, options);
5137}
5156inline poplar::Tensor
5159 const poplar::DebugContext &debugContext = {},
5160 const poplar::OptionFlags &options = {}) {
5161 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
5162
5163 auto output = map(graph, expr::BinaryOpType::VARIANCE_TO_INV_STD_DEV, A, B,
5164 prog, {di}, options);
5165 di.addOutput(output);
5166 return output;
5167}
5168
5169template <typename constType>
5170inline poplar::Tensor
5172 const constType B, poplar::program::Sequence &prog,
5173 const poplar::DebugContext &debugContext = {},
5174 const poplar::OptionFlags &options = {}) {
5175 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
5176
5177 checkTypes(A.elementType(), B);
5178 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
5179 graph.setTileMapping(BTensor, 0);
5180 auto output = map(graph, expr::BinaryOpType::VARIANCE_TO_INV_STD_DEV, A,
5181 BTensor, prog, {di}, options);
5182 di.addOutput(output);
5183 return output;
5184}
5185
5186template <typename constType>
5187inline poplar::Tensor
5188varianceToInvStdDev(poplar::Graph &graph, const constType A,
5190 const poplar::DebugContext &debugContext = {},
5191 const poplar::OptionFlags &options = {}) {
5192 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
5193
5194 checkTypes(B.elementType(), A);
5195 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
5196 graph.setTileMapping(ATensor, 0);
5197 auto output = map(graph, expr::BinaryOpType::VARIANCE_TO_INV_STD_DEV, ATensor,
5198 B, prog, {di}, options);
5199 di.addOutput(output);
5200 return output;
5201}
5208inline void
5210 const poplar::Tensor &B,
5212 const poplar::DebugContext &debugContext = {},
5213 const poplar::OptionFlags &options = {}) {
5214 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
5215
5216 mapInPlace(graph, expr::BinaryOpType::VARIANCE_TO_INV_STD_DEV, A, B, prog,
5217 {di}, options);
5218}
5219
5220template <typename constType>
5221inline void
5223 const constType B, poplar::program::Sequence &prog,
5224 const poplar::DebugContext &debugContext = {},
5225 const poplar::OptionFlags &options = {}) {
5226 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, options));
5227
5228 checkTypes(A.elementType(), B);
5229 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
5230 graph.setTileMapping(BTensor, 0);
5231 mapInPlace(graph, expr::BinaryOpType::VARIANCE_TO_INV_STD_DEV, A, BTensor,
5232 prog, {di}, options);
5233}
5241 poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B,
5242 const poplar::Tensor &out, poplar::program::Sequence &prog,
5243 const poplar::DebugContext &debugContext = {},
5244 const poplar::OptionFlags &options = {}) {
5245 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
5246
5247 mapWithOutput(graph, expr::BinaryOpType::VARIANCE_TO_INV_STD_DEV, A, B, out,
5248 prog, {di}, options);
5249}
5250
5251template <typename constType>
5252inline void
5254 const constType B, const poplar::Tensor &out,
5256 const poplar::DebugContext &debugContext = {},
5257 const poplar::OptionFlags &options = {}) {
5258 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
5259
5260 checkTypes(A.elementType(), B);
5261 const auto BTensor = graph.addConstant(A.elementType(), {}, B, {di});
5262 graph.setTileMapping(BTensor, 0);
5263 mapWithOutput(graph, expr::BinaryOpType::VARIANCE_TO_INV_STD_DEV, A, BTensor,
5264 out, prog, {di}, options);
5265}
5266
5267template <typename constType>
5269 poplar::Graph &graph, const constType A, const poplar::Tensor &B,
5270 const poplar::Tensor &out, poplar::program::Sequence &prog,
5271 const poplar::DebugContext &debugContext = {},
5272 const poplar::OptionFlags &options = {}) {
5273 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, out, options));
5274
5275 checkTypes(B.elementType(), A);
5276 const auto ATensor = graph.addConstant(B.elementType(), {}, A, {di});
5277 graph.setTileMapping(ATensor, 0);
5278 mapWithOutput(graph, expr::BinaryOpType::VARIANCE_TO_INV_STD_DEV, ATensor, B,
5279 out, prog, {di}, options);
5280}
5283// Ternary operations
5284
5306 const poplar::Tensor &B, const poplar::Tensor &C,
5308 const poplar::DebugContext &debugContext = {},
5309 const poplar::OptionFlags &options = {}) {
5310 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, C, options));
5311 auto output =
5312 map(graph, expr::TernaryOpType::SELECT, A, B, C, prog, {di}, options);
5313 di.addOutput(output);
5314 return output;
5315}
5316
5319inline void selectInPlace(poplar::Graph &graph, const poplar::Tensor &A,
5320 const poplar::Tensor &B, const poplar::Tensor &C,
5322 const poplar::DebugContext &debugContext = {},
5323 const poplar::OptionFlags &options = {}) {
5324 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, C, options));
5325 mapInPlace(graph, expr::TernaryOpType::SELECT, A, B, C, prog, {di}, options);
5326}
5327
5330inline void selectWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
5331 const poplar::Tensor &B, const poplar::Tensor &C,
5332 const poplar::Tensor &out,
5334 const poplar::DebugContext &debugContext = {},
5335 const poplar::OptionFlags &options = {}) {
5336 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, C, out, options));
5337 mapWithOutput(graph, expr::TernaryOpType::SELECT, A, B, C, out, prog, {di},
5338 options);
5339}
5340
5362 const poplar::Tensor &B, const poplar::Tensor &C,
5364 const poplar::DebugContext &debugContext = {},
5365 const poplar::OptionFlags &options = {}) {
5366 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, C, options));
5367
5368 auto output =
5369 map(graph, expr::TernaryOpType::CLAMP, A, B, C, prog, {di}, options);
5370 di.addOutput(output);
5371 return output;
5372}
5373
5376inline void clampInPlace(poplar::Graph &graph, const poplar::Tensor &A,
5377 const poplar::Tensor &B, const poplar::Tensor &C,
5379 const poplar::DebugContext &debugContext = {},
5380 const poplar::OptionFlags &options = {}) {
5381 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, C, options));
5382
5383 mapInPlace(graph, expr::TernaryOpType::CLAMP, A, B, C, prog, {di}, options);
5384}
5385
5388inline void clampWithOutput(poplar::Graph &graph, const poplar::Tensor &A,
5389 const poplar::Tensor &B, const poplar::Tensor &C,
5390 const poplar::Tensor &out,
5392 const poplar::DebugContext &debugContext = {},
5393 const poplar::OptionFlags &options = {}) {
5394 poputil::PoplibsOpDebugInfo di(debugContext, DI_ARGS(A, B, C, out, options));
5395
5396 mapWithOutput(graph, expr::TernaryOpType::CLAMP, A, B, C, out, prog, {di},
5397 options);
5398}
5399
5400} // end namespace popops
5401
5402#endif // popops_ElementWise_hpp
Poplibs generic debug info structure.
TernaryOpType
Enumeration defining operators used by Expr for building expressions.
Definition: ExprOp.hpp:16
Expressions with elements of tensors.
DebugContext gathers the common external parameters of the context of an operation.
Definition: DebugContext.hpp:221
This class represents a graph program to be executed on the IPU.
Definition: Graph.hpp:52
Tensor addConstant(const Type &type, const Tensor &metadata, ArrayRef< std::size_t > shape, ArrayRef< T > values, const DebugContext &debugContext={"<const>"})
Add a constant to the graph with a type that may require metadata.
Definition: Graph.hpp:427
void setTileMapping(VertexRef v, unsigned tileNum)
Map a vertex to a specific tile on the device.
A set of option/value string flags to be used in various APIs.
Definition: OptionFlags.hpp:24
ProfileValue represents a read-only JSON-like tree of values that are used to store the output of the...
Definition: ProfileValue.hpp:39
A target representation.
Definition: Target.hpp:69
A reference to a subset of tensor elements.
Definition: Tensor.hpp:38
Type elementType() const
Get the element type information for this tensor.
Class representing device data types.
Definition: Type.hpp:42
Program that executes a sequence of programs.
Definition: Program.hpp:77
Type to represent element expressions.
Definition: Expr.hpp:36
Type FLOAT
Device type: float
Type HALF
Device type: half
Common functions, such as elementwise and reductions.
Definition: AllTrue.hpp:15
void rsqrtWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of rsqrt() to the given output tensor.
Definition: ElementWise.hpp:1564
poplar::Tensor signum(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute the signum of each element in A.
Definition: ElementWise.hpp:1172
void geluErfInPlace(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of geluErf().
Definition: ElementWise.hpp:537
void bitwiseOrWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of bitwiseOr() to the given output tensor.
Definition: ElementWise.hpp:2158
poplar::Tensor add(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Add each element in A to the corresponding element in B.
Definition: ElementWise.hpp:1664
void remInPlace(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of rem().
Definition: ElementWise.hpp:4504
void tanInPlace(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of tan().
Definition: ElementWise.hpp:1277
void selectInPlace(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, const poplar::Tensor &C, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of select().
Definition: ElementWise.hpp:5319
void sinInPlace(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of sin().
Definition: ElementWise.hpp:1231
poplar::Tensor max(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute the maximum of each element in A with the corresponding element in B.
Definition: ElementWise.hpp:3767
void addInPlace(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of add().
Definition: ElementWise.hpp:1714
void mapInPlace(poplar::Graph &graph, const expr::Expr &expr, const std::vector< poplar::Tensor > &ts, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensors with the result of map().
void erfInPlace(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of erf().
Definition: ElementWise.hpp:726
poplar::Tensor neg(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute the negation of each element in A.
Definition: ElementWise.hpp:1078
void logicalNotWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of logicalNot() to the given output tensor.
Definition: ElementWise.hpp:1055
void shiftLeftWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of shiftLeft() to the given output tensor.
Definition: ElementWise.hpp:4671
void atan2InPlace(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of atan2().
Definition: ElementWise.hpp:1850
void roundInPlace(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of round().
Definition: ElementWise.hpp:1369
void signumInPlace(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of signum().
Definition: ElementWise.hpp:1185
poplar::Tensor div(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Divide each element in A by the corresponding element in B.
Definition: ElementWise.hpp:2507
void rsqrtInPlace(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of rsqrt().
Definition: ElementWise.hpp:1553
void sigmoidInPlace(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of sigmoid().
Definition: ElementWise.hpp:1507
void bitwiseXorWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of bitwiseXor() to the given output tensor.
Definition: ElementWise.hpp:2301
void cosInPlace(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of cos().
Definition: ElementWise.hpp:683
void tanWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of tan() to the given output tensor.
Definition: ElementWise.hpp:1288
void maxInPlace(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of max().
Definition: ElementWise.hpp:3818
poplar::Tensor square(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute the square for each element in A.
Definition: ElementWise.hpp:1448
void log1pWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of log1p() to the given output tensor.
Definition: ElementWise.hpp:1007
poplar::Tensor exp(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute the exponential of each element in A.
Definition: ElementWise.hpp:757
void invWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of inv() to the given output tensor.
Definition: ElementWise.hpp:912
void shiftRightSignExtendInPlace(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of shiftRightSignExtend().
Definition: ElementWise.hpp:4929
void bitwiseNotWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of bitwiseNot() to the given output tensor.
Definition: ElementWise.hpp:454
void invStdDevToVarianceWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of invStdDevToVariance() to the given output tensor.
Definition: ElementWise.hpp:3144
void minWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of min() to the given output tensor.
Definition: ElementWise.hpp:3984
void bitwiseXorInPlace(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of bitwiseXor().
Definition: ElementWise.hpp:2271
poplar::Tensor bitwiseXnor(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute the bitwise XNOR of each element in A with the corresponding element in B.
Definition: ElementWise.hpp:2362
void roundWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of round() to the given output tensor.
Definition: ElementWise.hpp:1380
void geluErfWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of geluErf() to the given output tensor.
Definition: ElementWise.hpp:548
void varianceToInvStdDevWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of varianceToInvStdDev() to the given output tensor.
Definition: ElementWise.hpp:5240
poplar::Tensor logicalNot(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute the logical NOT of each element in A.
Definition: ElementWise.hpp:1030
void logWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of log() to the given output tensor.
Definition: ElementWise.hpp:958
void subInPlace(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of sub().
Definition: ElementWise.hpp:5070
void bitwiseNotInPlace(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of bitwiseNot().
Definition: ElementWise.hpp:443
void countLeadingZerosInPlace(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of countLeadingZeros().
Definition: ElementWise.hpp:635
poplar::Tensor sigmoid(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute the sigmoid (logistic) function for each element in A.
Definition: ElementWise.hpp:1494
void shiftRightSignExtendWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of shiftRightSignExtend() to the given output tensor.
Definition: ElementWise.hpp:4960
void logInPlace(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of log().
Definition: ElementWise.hpp:947
poplar::Tensor inv(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute the inverse of each element in A.
Definition: ElementWise.hpp:890
poplar::Tensor neq(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Check if each element in A is not equal to the corresponding element in B.
Definition: ElementWise.hpp:4180
void erfWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of erf() to the given output tensor.
Definition: ElementWise.hpp:736
void countLeadingZerosWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of countLeadingZeros() to the given output tensor.
Definition: ElementWise.hpp:648
void tanhWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of tanh() to the given output tensor.
Definition: ElementWise.hpp:1334
void ceilWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of ceil() to the given output tensor.
Definition: ElementWise.hpp:595
void squareWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of square() to the given output tensor.
Definition: ElementWise.hpp:1472
void gteqInPlace(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of gteq().
Definition: ElementWise.hpp:2832
poplar::Tensor floor(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute the floor of each element in A.
Definition: ElementWise.hpp:847
poplar::Tensor log(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute the log base-e of each element in A.
Definition: ElementWise.hpp:933
poplar::Tensor popcount(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute the number of 1 bits in each element of A.
Definition: ElementWise.hpp:1124
void cbrtInPlace(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of cbrt().
Definition: ElementWise.hpp:490
void floorInPlace(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of floor().
Definition: ElementWise.hpp:859
void expm1InPlace(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of expm1().
Definition: ElementWise.hpp:814
void minInPlace(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of min().
Definition: ElementWise.hpp:3956
void shiftLeftInPlace(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of shiftLeft().
Definition: ElementWise.hpp:4642
poplar::Tensor min(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute the minimum of each element in A with the corresponding element in B.
Definition: ElementWise.hpp:3905
void asinInPlace(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of asin().
Definition: ElementWise.hpp:396
poplar::Tensor bitwiseAnd(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute the bitwise AND of each element in A with the corresponding element in B.
Definition: ElementWise.hpp:1936
poplar::Tensor asin(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute the arc-sine of each element in A.
Definition: ElementWise.hpp:383
poplar::Tensor countLeadingZeros(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute the number of binary leading zeros of each element in A.
Definition: ElementWise.hpp:620
void expInPlace(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of exp().
Definition: ElementWise.hpp:769
poplar::Tensor shiftLeft(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Shift the elements of A left by the corresponding elements of B.
Definition: ElementWise.hpp:4590
void maxWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of max() to the given output tensor.
Definition: ElementWise.hpp:3846
void neqWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of neq() to the given output tensor.
Definition: ElementWise.hpp:4259
void log1pInPlace(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of log1p().
Definition: ElementWise.hpp:995
void sqrtWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of sqrt() to the given output tensor.
Definition: ElementWise.hpp:1426
poplar::Tensor sub(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Subtract the elements of B from A and return the result in a new tensor.
Definition: ElementWise.hpp:5019
void floorWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of floor() to the given output tensor.
Definition: ElementWise.hpp:869
void logicalNotInPlace(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of logicalNot().
Definition: ElementWise.hpp:1044
void invStdDevToVarianceInPlace(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of invStdDevToVariance().
Definition: ElementWise.hpp:3113
void powWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of pow() to the given output tensor.
Definition: ElementWise.hpp:4395
poplar::Tensor ceil(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute the ceiling of each element in A.
Definition: ElementWise.hpp:571
void cosWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of cos() to the given output tensor.
Definition: ElementWise.hpp:693
void selectWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, const poplar::Tensor &C, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of select() to the given output tensor.
Definition: ElementWise.hpp:5330
poplar::Tensor abs(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute the absolute value of each element in A.
Definition: ElementWise.hpp:335
void shiftRightInPlace(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of shiftRight().
Definition: ElementWise.hpp:4784
poplar::Tensor log1p(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute the log base-e of each element in A plus one.
Definition: ElementWise.hpp:981
poplar::Tensor pow(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute each element in A to the power of the corresponding element in B.
Definition: ElementWise.hpp:4317
poplar::Tensor sin(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute the sine of each element in A.
Definition: ElementWise.hpp:1218
poplar::Tensor shiftRightSignExtend(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Shift the elements of A right with sign extension by the corresponding elements of B.
Definition: ElementWise.hpp:4877
poplar::Tensor isFinite(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Check if each element in A is finite.
Definition: ElementWise.hpp:1586
void eqInPlace(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of eq().
Definition: ElementWise.hpp:2695
poplar::Tensor geluErf(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute (1 + erf(A/sqrt(2))) * A / 2 where all the operations are element-wise, and erf is the error ...
Definition: ElementWise.hpp:524
void gteqWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of gteq() to the given output tensor.
Definition: ElementWise.hpp:2862
poplar::Tensor shiftRight(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Shift the elements of A right by the corresponding elements of B.
Definition: ElementWise.hpp:4732
void popcountInPlace(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of popcount().
Definition: ElementWise.hpp:1137
poplar::Tensor gteq(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Check if each element in A is greater than or equal to the corresponding element in B.
Definition: ElementWise.hpp:2781
void neqInPlace(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of neq().
Definition: ElementWise.hpp:4231
void powInPlace(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of pow().
Definition: ElementWise.hpp:4368
void logicalOrWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of logicalOr() to the given output tensor.
Definition: ElementWise.hpp:3568
void isFiniteWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of isFinite() to the given output tensor.
Definition: ElementWise.hpp:1600
poplar::Tensor lteq(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Check if each element in A is less than or equal to the corresponding element in B.
Definition: ElementWise.hpp:3204
void sqrtInPlace(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of sqrt().
Definition: ElementWise.hpp:1415
void clampWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, const poplar::Tensor &C, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of clamp() to the given output tensor.
Definition: ElementWise.hpp:5388
void ltInPlace(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of lt().
Definition: ElementWise.hpp:3680
poplar::Tensor round(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Round each element in A.
Definition: ElementWise.hpp:1356
poplar::Tensor gt(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Check if each element in A is greater than the corresponding element in B.
Definition: ElementWise.hpp:2921
poplar::Tensor clamp(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, const poplar::Tensor &C, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Populate the returned tensor with elements from A but clamp them such that each element is greater th...
Definition: ElementWise.hpp:5361
poplar::Tensor tan(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute the tangent of each element in A.
Definition: ElementWise.hpp:1264
void lteqInPlace(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of lteq().
Definition: ElementWise.hpp:3255
void bitwiseXnorWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of bitwiseXnor() to the given output tensor.
Definition: ElementWise.hpp:2446
poplar::Tensor logicalOr(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute the logical OR (||) of each element in A with the corresponding element in B.
Definition: ElementWise.hpp:3487
void addWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of add() to the given output tensor.
Definition: ElementWise.hpp:1741
poplar::Tensor lt(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Check if each element in A is less than the corresponding element in B.
Definition: ElementWise.hpp:3629
poplar::Tensor cbrt(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute the cube-root for each element in A.
Definition: ElementWise.hpp:477
void absInPlace(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of abs().
Definition: ElementWise.hpp:348
void mapWithOutput(poplar::Graph &graph, const expr::Expr &expr, const std::vector< poplar::Tensor > &ts, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of map() to the given output tensor.
void absWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of abs() to the given output tensor.
Definition: ElementWise.hpp:359
void bitwiseOrInPlace(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of bitwiseOr().
Definition: ElementWise.hpp:2129
void eqWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of eq() to the given output tensor.
Definition: ElementWise.hpp:2722
void expWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of exp() to the given output tensor.
Definition: ElementWise.hpp:779
void tanhInPlace(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of tanh().
Definition: ElementWise.hpp:1323
void shiftRightWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of shiftRight() to the given output tensor.
Definition: ElementWise.hpp:4814
poplar::Tensor rem(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute the remainder of each element in A divided by the corresponding element in B.
Definition: ElementWise.hpp:4453
void outputGeneratedCodelet(const poplar::Target &target, const expr::Expr &expr, const std::vector< poplar::Tensor > &ts, const poplar::OptionFlags &options, std::ostream &os)
Writes the generated codelet for the given expr and ts to os.
void expm1WithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of expm1() to the given output tensor.
Definition: ElementWise.hpp:825
poplar::Tensor eq(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Check if each element in A is equal to the corresponding element in B.
Definition: ElementWise.hpp:2644
poplar::Tensor rsqrt(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute the reciprocal square root for each element in A.
Definition: ElementWise.hpp:1540
void checkTypes(poplar::Type elementType, constType)
Check that the host compile-time type constType is compatible with the run-time IPU type elementType.
Definition: ElementWise.hpp:1622
void subWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of sub() to the given output tensor.
Definition: ElementWise.hpp:5098
void logicalAndInPlace(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of logicalAnd().
Definition: ElementWise.hpp:3396
void signumWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of signum() to the given output tensor.
Definition: ElementWise.hpp:1196
poplar::Tensor logicalAnd(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute the logical AND (&&) of each element in A with the corresponding element in B.
Definition: ElementWise.hpp:3344
void gtWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of gt() to the given output tensor.
Definition: ElementWise.hpp:3001
void cbrtWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of cbrt() to the given output tensor.
Definition: ElementWise.hpp:501
poplar::Tensor atan2(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute the two argument arctangent of each element in A with the corresponding element in B.
Definition: ElementWise.hpp:1799
poplar::Tensor bitwiseOr(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute the bitwise OR of each element in A with the corresponding element in B.
Definition: ElementWise.hpp:2077
void ltWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of lt() to the given output tensor.
Definition: ElementWise.hpp:3708
void mulWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of mul() to the given output tensor.
Definition: ElementWise.hpp:4121
void logicalOrInPlace(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of logicalOr().
Definition: ElementWise.hpp:3539
poplar::Tensor varianceToInvStdDev(poplar::Graph &graph, const poplar::Tensor &src, const poplar::Tensor &epsilon, poplar::program::Sequence &prog, const poplar::Type dstType=poplar::HALF, const poplar::DebugContext &debugContext={})
Convert variance to inverse standard deviation.
void invInPlace(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of inv().
Definition: ElementWise.hpp:902
void mulInPlace(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of mul().
Definition: ElementWise.hpp:4093
poplar::Tensor bitwiseNot(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute the bitwise NOT operation for each element in A.
Definition: ElementWise.hpp:429
poplar::Tensor invStdDevToVariance(poplar::Graph &graph, const poplar::Tensor &src, const poplar::Tensor &epsilon, poplar::program::Sequence &prog, const poplar::Type dstType=poplar::FLOAT, const poplar::DebugContext &debugContext={})
Convert inverse standard deviation to variance.
poplar::Tensor erf(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute the error function of each element in A.
Definition: ElementWise.hpp:714
void divInPlace(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of div().
Definition: ElementWise.hpp:2558
void sinWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of sin() to the given output tensor.
Definition: ElementWise.hpp:1242
void asinWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of asin() to the given output tensor.
Definition: ElementWise.hpp:407
void logicalAndWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of logicalAnd() to the given output tensor.
Definition: ElementWise.hpp:3426
void negInPlace(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of neg().
Definition: ElementWise.hpp:1091
poplar::Tensor select(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, const poplar::Tensor &C, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Populate the returned tensor with elements from A or B depending on the corresponding element of C.
Definition: ElementWise.hpp:5305
void bitwiseXnorInPlace(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of bitwiseXnor().
Definition: ElementWise.hpp:2415
void remWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of rem() to the given output tensor.
Definition: ElementWise.hpp:4532
void clampInPlace(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, const poplar::Tensor &C, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of clamp().
Definition: ElementWise.hpp:5376
void sigmoidWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of sigmoid() to the given output tensor.
Definition: ElementWise.hpp:1518
void bitwiseAndInPlace(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of bitwiseAnd().
Definition: ElementWise.hpp:1987
poplar::Tensor bitwiseXor(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute the bitwise XOR of each element in A with the corresponding element in B.
Definition: ElementWise.hpp:2219
poplar::Tensor mul(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Multiply each element in A by the corresponding element in B.
Definition: ElementWise.hpp:4042
void negWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of neg() to the given output tensor.
Definition: ElementWise.hpp:1102
poplar::Tensor cos(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute the cosine of each element in A.
Definition: ElementWise.hpp:671
poplar::Tensor sqrt(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute the square-root for each element in A.
Definition: ElementWise.hpp:1402
void divWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of div() to the given output tensor.
Definition: ElementWise.hpp:2586
void lteqWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of lteq() to the given output tensor.
Definition: ElementWise.hpp:3285
void bitwiseAndWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of bitwiseAnd() to the given output tensor.
Definition: ElementWise.hpp:2017
poplar::Tensor tanh(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute the hyperbolic tangent of each element in A.
Definition: ElementWise.hpp:1310
void ceilInPlace(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of ceil().
Definition: ElementWise.hpp:584
poplar::Tensor map(poplar::Graph &graph, const expr::Expr &expr, const std::vector< poplar::Tensor > &ts, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Map an expression across tensors.
void gtInPlace(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of gt().
Definition: ElementWise.hpp:2972
void atan2WithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of atan2() to the given output tensor.
Definition: ElementWise.hpp:1878
void varianceToInvStdDevInPlace(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &B, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of varianceToInvStdDev().
Definition: ElementWise.hpp:5209
void popcountWithOutput(poplar::Graph &graph, const poplar::Tensor &A, const poplar::Tensor &out, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Write the result of popcount() to the given output tensor.
Definition: ElementWise.hpp:1148
poplar::Tensor expm1(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute the exponential of each element in A minus one.
Definition: ElementWise.hpp:801
void squareInPlace(poplar::Graph &graph, const poplar::Tensor &A, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update the input tensor with the result of square().
Definition: ElementWise.hpp:1461
General utility functions for building graphs.
Definition: GfloatExprUtil.hpp:23
Template structure to relate a host type to a device type.
Definition: Type.hpp:192