8 USE iso_c_binding,
ONLY: c_associated, &
22#include "./base/base_uses.f90"
30 TYPE(C_PTR) :: c_ptr = c_null_ptr
35 TYPE(C_PTR) :: c_ptr = c_null_ptr
40 TYPE(C_PTR) :: c_ptr = c_null_ptr
44 MODULE PROCEDURE torch_tensor_from_array_float_1d
45 MODULE PROCEDURE torch_tensor_from_array_int64_1d
46 MODULE PROCEDURE torch_tensor_from_array_double_1d
47 MODULE PROCEDURE torch_tensor_from_array_float_2d
48 MODULE PROCEDURE torch_tensor_from_array_int64_2d
49 MODULE PROCEDURE torch_tensor_from_array_double_2d
50 MODULE PROCEDURE torch_tensor_from_array_float_3d
51 MODULE PROCEDURE torch_tensor_from_array_int64_3d
52 MODULE PROCEDURE torch_tensor_from_array_double_3d
56 MODULE PROCEDURE torch_tensor_data_ptr_float_1d
57 MODULE PROCEDURE torch_tensor_data_ptr_int64_1d
58 MODULE PROCEDURE torch_tensor_data_ptr_double_1d
59 MODULE PROCEDURE torch_tensor_data_ptr_float_2d
60 MODULE PROCEDURE torch_tensor_data_ptr_int64_2d
61 MODULE PROCEDURE torch_tensor_data_ptr_double_2d
62 MODULE PROCEDURE torch_tensor_data_ptr_float_3d
63 MODULE PROCEDURE torch_tensor_data_ptr_int64_3d
64 MODULE PROCEDURE torch_tensor_data_ptr_double_3d
68 MODULE PROCEDURE torch_model_get_attr_string
69 MODULE PROCEDURE torch_model_get_attr_double
70 MODULE PROCEDURE torch_model_get_attr_int64
71 MODULE PROCEDURE torch_model_get_attr_int32
72 MODULE PROCEDURE torch_model_get_attr_strlist
91 SUBROUTINE torch_tensor_from_array_float_1d(tensor, source, requires_grad)
93 REAL(sp),
DIMENSION(:),
ALLOCATABLE,
INTENT(IN) :: source
94 LOGICAL,
OPTIONAL,
INTENT(IN) :: requires_grad
96#if defined(__LIBTORCH)
97 INTEGER(kind=int_8),
DIMENSION(1) :: sizes_c
98 LOGICAL :: my_req_grad
101 SUBROUTINE torch_c_tensor_from_array_float (tensor, req_grad, ndims, sizes, source) &
102 BIND(C, name="torch_c_tensor_from_array_float")
103 IMPORT :: c_ptr, c_int, c_int64_t, c_float, c_double, c_bool
104 TYPE(c_ptr) :: tensor
105 LOGICAL(kind=C_BOOL),
VALUE :: req_grad
106 INTEGER(kind=C_INT),
VALUE :: ndims
107 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
108 REAL(kind=c_float),
DIMENSION(*) :: source
109 END SUBROUTINE torch_c_tensor_from_array_float
112 my_req_grad = .false.
113 IF (
PRESENT(requires_grad)) my_req_grad = requires_grad
115 sizes_c(1) =
SIZE(source, 1)
117 cpassert(.NOT. c_associated(tensor%c_ptr))
118 CALL torch_c_tensor_from_array_float (tensor=tensor%c_ptr, &
119 req_grad=
LOGICAL(my_req_grad, C_BOOL), &
123 cpassert(c_associated(tensor%c_ptr))
125 cpabort(
"CP2K compiled without the Torch library.")
128 mark_used(requires_grad)
130 END SUBROUTINE torch_tensor_from_array_float_1d
137 SUBROUTINE torch_tensor_data_ptr_float_1d(tensor, data_ptr)
139 REAL(sp),
DIMENSION(:),
POINTER :: data_ptr
141#if defined(__LIBTORCH)
142 INTEGER(kind=int_8),
DIMENSION(1) :: sizes_f, sizes_c
143 TYPE(c_ptr) :: data_ptr_c
146 SUBROUTINE torch_c_tensor_data_ptr_float (tensor, ndims, sizes, data_ptr) &
147 BIND(C, name="torch_c_tensor_data_ptr_float")
148 IMPORT :: c_char, c_ptr, c_int, c_int64_t
149 TYPE(c_ptr),
VALUE :: tensor
150 INTEGER(kind=C_INT),
VALUE :: ndims
151 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
152 TYPE(c_ptr) :: data_ptr
153 END SUBROUTINE torch_c_tensor_data_ptr_float
157 data_ptr_c = c_null_ptr
158 cpassert(c_associated(tensor%c_ptr))
159 cpassert(.NOT.
ASSOCIATED(data_ptr))
160 CALL torch_c_tensor_data_ptr_float (tensor=tensor%c_ptr, &
165 cpassert(all(sizes_c >= 0))
166 cpassert(c_associated(data_ptr_c))
168 sizes_f(1) = sizes_c(1)
169 CALL c_f_pointer(data_ptr_c, data_ptr, shape=sizes_f)
171 cpabort(
"CP2K compiled without the Torch library.")
175 END SUBROUTINE torch_tensor_data_ptr_float_1d
183 SUBROUTINE torch_tensor_from_array_int64_1d(tensor, source, requires_grad)
185 INTEGER(kind=int_8),
DIMENSION(:),
ALLOCATABLE,
INTENT(IN) :: source
186 LOGICAL,
OPTIONAL,
INTENT(IN) :: requires_grad
188#if defined(__LIBTORCH)
189 INTEGER(kind=int_8),
DIMENSION(1) :: sizes_c
190 LOGICAL :: my_req_grad
193 SUBROUTINE torch_c_tensor_from_array_int64 (tensor, req_grad, ndims, sizes, source) &
194 BIND(C, name="torch_c_tensor_from_array_int64")
195 IMPORT :: c_ptr, c_int, c_int64_t, c_float, c_double, c_bool
196 TYPE(c_ptr) :: tensor
197 LOGICAL(kind=C_BOOL),
VALUE :: req_grad
198 INTEGER(kind=C_INT),
VALUE :: ndims
199 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
200 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: source
201 END SUBROUTINE torch_c_tensor_from_array_int64
204 my_req_grad = .false.
205 IF (
PRESENT(requires_grad)) my_req_grad = requires_grad
207 sizes_c(1) =
SIZE(source, 1)
209 cpassert(.NOT. c_associated(tensor%c_ptr))
210 CALL torch_c_tensor_from_array_int64 (tensor=tensor%c_ptr, &
211 req_grad=
LOGICAL(my_req_grad, C_BOOL), &
215 cpassert(c_associated(tensor%c_ptr))
217 cpabort(
"CP2K compiled without the Torch library.")
220 mark_used(requires_grad)
222 END SUBROUTINE torch_tensor_from_array_int64_1d
229 SUBROUTINE torch_tensor_data_ptr_int64_1d(tensor, data_ptr)
231 INTEGER(kind=int_8),
DIMENSION(:),
POINTER :: data_ptr
233#if defined(__LIBTORCH)
234 INTEGER(kind=int_8),
DIMENSION(1) :: sizes_f, sizes_c
235 TYPE(c_ptr) :: data_ptr_c
238 SUBROUTINE torch_c_tensor_data_ptr_int64 (tensor, ndims, sizes, data_ptr) &
239 BIND(C, name="torch_c_tensor_data_ptr_int64")
240 IMPORT :: c_char, c_ptr, c_int, c_int64_t
241 TYPE(c_ptr),
VALUE :: tensor
242 INTEGER(kind=C_INT),
VALUE :: ndims
243 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
244 TYPE(c_ptr) :: data_ptr
245 END SUBROUTINE torch_c_tensor_data_ptr_int64
249 data_ptr_c = c_null_ptr
250 cpassert(c_associated(tensor%c_ptr))
251 cpassert(.NOT.
ASSOCIATED(data_ptr))
252 CALL torch_c_tensor_data_ptr_int64 (tensor=tensor%c_ptr, &
257 cpassert(all(sizes_c >= 0))
258 cpassert(c_associated(data_ptr_c))
260 sizes_f(1) = sizes_c(1)
261 CALL c_f_pointer(data_ptr_c, data_ptr, shape=sizes_f)
263 cpabort(
"CP2K compiled without the Torch library.")
267 END SUBROUTINE torch_tensor_data_ptr_int64_1d
275 SUBROUTINE torch_tensor_from_array_double_1d(tensor, source, requires_grad)
277 REAL(dp),
DIMENSION(:),
ALLOCATABLE,
INTENT(IN) :: source
278 LOGICAL,
OPTIONAL,
INTENT(IN) :: requires_grad
280#if defined(__LIBTORCH)
281 INTEGER(kind=int_8),
DIMENSION(1) :: sizes_c
282 LOGICAL :: my_req_grad
285 SUBROUTINE torch_c_tensor_from_array_double (tensor, req_grad, ndims, sizes, source) &
286 BIND(C, name="torch_c_tensor_from_array_double")
287 IMPORT :: c_ptr, c_int, c_int64_t, c_float, c_double, c_bool
288 TYPE(c_ptr) :: tensor
289 LOGICAL(kind=C_BOOL),
VALUE :: req_grad
290 INTEGER(kind=C_INT),
VALUE :: ndims
291 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
292 REAL(kind=c_double),
DIMENSION(*) :: source
293 END SUBROUTINE torch_c_tensor_from_array_double
296 my_req_grad = .false.
297 IF (
PRESENT(requires_grad)) my_req_grad = requires_grad
299 sizes_c(1) =
SIZE(source, 1)
301 cpassert(.NOT. c_associated(tensor%c_ptr))
302 CALL torch_c_tensor_from_array_double (tensor=tensor%c_ptr, &
303 req_grad=
LOGICAL(my_req_grad, C_BOOL), &
307 cpassert(c_associated(tensor%c_ptr))
309 cpabort(
"CP2K compiled without the Torch library.")
312 mark_used(requires_grad)
314 END SUBROUTINE torch_tensor_from_array_double_1d
321 SUBROUTINE torch_tensor_data_ptr_double_1d(tensor, data_ptr)
323 REAL(dp),
DIMENSION(:),
POINTER :: data_ptr
325#if defined(__LIBTORCH)
326 INTEGER(kind=int_8),
DIMENSION(1) :: sizes_f, sizes_c
327 TYPE(c_ptr) :: data_ptr_c
330 SUBROUTINE torch_c_tensor_data_ptr_double (tensor, ndims, sizes, data_ptr) &
331 BIND(C, name="torch_c_tensor_data_ptr_double")
332 IMPORT :: c_char, c_ptr, c_int, c_int64_t
333 TYPE(c_ptr),
VALUE :: tensor
334 INTEGER(kind=C_INT),
VALUE :: ndims
335 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
336 TYPE(c_ptr) :: data_ptr
337 END SUBROUTINE torch_c_tensor_data_ptr_double
341 data_ptr_c = c_null_ptr
342 cpassert(c_associated(tensor%c_ptr))
343 cpassert(.NOT.
ASSOCIATED(data_ptr))
344 CALL torch_c_tensor_data_ptr_double (tensor=tensor%c_ptr, &
349 cpassert(all(sizes_c >= 0))
350 cpassert(c_associated(data_ptr_c))
352 sizes_f(1) = sizes_c(1)
353 CALL c_f_pointer(data_ptr_c, data_ptr, shape=sizes_f)
355 cpabort(
"CP2K compiled without the Torch library.")
359 END SUBROUTINE torch_tensor_data_ptr_double_1d
367 SUBROUTINE torch_tensor_from_array_float_2d(tensor, source, requires_grad)
369 REAL(sp),
DIMENSION(:, :),
ALLOCATABLE,
INTENT(IN) :: source
370 LOGICAL,
OPTIONAL,
INTENT(IN) :: requires_grad
372#if defined(__LIBTORCH)
373 INTEGER(kind=int_8),
DIMENSION(2) :: sizes_c
374 LOGICAL :: my_req_grad
377 SUBROUTINE torch_c_tensor_from_array_float (tensor, req_grad, ndims, sizes, source) &
378 BIND(C, name="torch_c_tensor_from_array_float")
379 IMPORT :: c_ptr, c_int, c_int64_t, c_float, c_double, c_bool
380 TYPE(c_ptr) :: tensor
381 LOGICAL(kind=C_BOOL),
VALUE :: req_grad
382 INTEGER(kind=C_INT),
VALUE :: ndims
383 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
384 REAL(kind=c_float),
DIMENSION(*) :: source
385 END SUBROUTINE torch_c_tensor_from_array_float
388 my_req_grad = .false.
389 IF (
PRESENT(requires_grad)) my_req_grad = requires_grad
391 sizes_c(1) =
SIZE(source, 2)
392 sizes_c(2) =
SIZE(source, 1)
394 cpassert(.NOT. c_associated(tensor%c_ptr))
395 CALL torch_c_tensor_from_array_float (tensor=tensor%c_ptr, &
396 req_grad=
LOGICAL(my_req_grad, C_BOOL), &
400 cpassert(c_associated(tensor%c_ptr))
402 cpabort(
"CP2K compiled without the Torch library.")
405 mark_used(requires_grad)
407 END SUBROUTINE torch_tensor_from_array_float_2d
414 SUBROUTINE torch_tensor_data_ptr_float_2d(tensor, data_ptr)
416 REAL(sp),
DIMENSION(:, :),
POINTER :: data_ptr
418#if defined(__LIBTORCH)
419 INTEGER(kind=int_8),
DIMENSION(2) :: sizes_f, sizes_c
420 TYPE(c_ptr) :: data_ptr_c
423 SUBROUTINE torch_c_tensor_data_ptr_float (tensor, ndims, sizes, data_ptr) &
424 BIND(C, name="torch_c_tensor_data_ptr_float")
425 IMPORT :: c_char, c_ptr, c_int, c_int64_t
426 TYPE(c_ptr),
VALUE :: tensor
427 INTEGER(kind=C_INT),
VALUE :: ndims
428 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
429 TYPE(c_ptr) :: data_ptr
430 END SUBROUTINE torch_c_tensor_data_ptr_float
434 data_ptr_c = c_null_ptr
435 cpassert(c_associated(tensor%c_ptr))
436 cpassert(.NOT.
ASSOCIATED(data_ptr))
437 CALL torch_c_tensor_data_ptr_float (tensor=tensor%c_ptr, &
442 cpassert(all(sizes_c >= 0))
443 cpassert(c_associated(data_ptr_c))
445 sizes_f(1) = sizes_c(2)
446 sizes_f(2) = sizes_c(1)
447 CALL c_f_pointer(data_ptr_c, data_ptr, shape=sizes_f)
449 cpabort(
"CP2K compiled without the Torch library.")
453 END SUBROUTINE torch_tensor_data_ptr_float_2d
461 SUBROUTINE torch_tensor_from_array_int64_2d(tensor, source, requires_grad)
463 INTEGER(kind=int_8),
DIMENSION(:, :),
ALLOCATABLE,
INTENT(IN) :: source
464 LOGICAL,
OPTIONAL,
INTENT(IN) :: requires_grad
466#if defined(__LIBTORCH)
467 INTEGER(kind=int_8),
DIMENSION(2) :: sizes_c
468 LOGICAL :: my_req_grad
471 SUBROUTINE torch_c_tensor_from_array_int64 (tensor, req_grad, ndims, sizes, source) &
472 BIND(C, name="torch_c_tensor_from_array_int64")
473 IMPORT :: c_ptr, c_int, c_int64_t, c_float, c_double, c_bool
474 TYPE(c_ptr) :: tensor
475 LOGICAL(kind=C_BOOL),
VALUE :: req_grad
476 INTEGER(kind=C_INT),
VALUE :: ndims
477 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
478 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: source
479 END SUBROUTINE torch_c_tensor_from_array_int64
482 my_req_grad = .false.
483 IF (
PRESENT(requires_grad)) my_req_grad = requires_grad
485 sizes_c(1) =
SIZE(source, 2)
486 sizes_c(2) =
SIZE(source, 1)
488 cpassert(.NOT. c_associated(tensor%c_ptr))
489 CALL torch_c_tensor_from_array_int64 (tensor=tensor%c_ptr, &
490 req_grad=
LOGICAL(my_req_grad, C_BOOL), &
494 cpassert(c_associated(tensor%c_ptr))
496 cpabort(
"CP2K compiled without the Torch library.")
499 mark_used(requires_grad)
501 END SUBROUTINE torch_tensor_from_array_int64_2d
508 SUBROUTINE torch_tensor_data_ptr_int64_2d(tensor, data_ptr)
510 INTEGER(kind=int_8),
DIMENSION(:, :),
POINTER :: data_ptr
512#if defined(__LIBTORCH)
513 INTEGER(kind=int_8),
DIMENSION(2) :: sizes_f, sizes_c
514 TYPE(c_ptr) :: data_ptr_c
517 SUBROUTINE torch_c_tensor_data_ptr_int64 (tensor, ndims, sizes, data_ptr) &
518 BIND(C, name="torch_c_tensor_data_ptr_int64")
519 IMPORT :: c_char, c_ptr, c_int, c_int64_t
520 TYPE(c_ptr),
VALUE :: tensor
521 INTEGER(kind=C_INT),
VALUE :: ndims
522 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
523 TYPE(c_ptr) :: data_ptr
524 END SUBROUTINE torch_c_tensor_data_ptr_int64
528 data_ptr_c = c_null_ptr
529 cpassert(c_associated(tensor%c_ptr))
530 cpassert(.NOT.
ASSOCIATED(data_ptr))
531 CALL torch_c_tensor_data_ptr_int64 (tensor=tensor%c_ptr, &
536 cpassert(all(sizes_c >= 0))
537 cpassert(c_associated(data_ptr_c))
539 sizes_f(1) = sizes_c(2)
540 sizes_f(2) = sizes_c(1)
541 CALL c_f_pointer(data_ptr_c, data_ptr, shape=sizes_f)
543 cpabort(
"CP2K compiled without the Torch library.")
547 END SUBROUTINE torch_tensor_data_ptr_int64_2d
555 SUBROUTINE torch_tensor_from_array_double_2d(tensor, source, requires_grad)
557 REAL(dp),
DIMENSION(:, :),
ALLOCATABLE,
INTENT(IN) :: source
558 LOGICAL,
OPTIONAL,
INTENT(IN) :: requires_grad
560#if defined(__LIBTORCH)
561 INTEGER(kind=int_8),
DIMENSION(2) :: sizes_c
562 LOGICAL :: my_req_grad
565 SUBROUTINE torch_c_tensor_from_array_double (tensor, req_grad, ndims, sizes, source) &
566 BIND(C, name="torch_c_tensor_from_array_double")
567 IMPORT :: c_ptr, c_int, c_int64_t, c_float, c_double, c_bool
568 TYPE(c_ptr) :: tensor
569 LOGICAL(kind=C_BOOL),
VALUE :: req_grad
570 INTEGER(kind=C_INT),
VALUE :: ndims
571 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
572 REAL(kind=c_double),
DIMENSION(*) :: source
573 END SUBROUTINE torch_c_tensor_from_array_double
576 my_req_grad = .false.
577 IF (
PRESENT(requires_grad)) my_req_grad = requires_grad
579 sizes_c(1) =
SIZE(source, 2)
580 sizes_c(2) =
SIZE(source, 1)
582 cpassert(.NOT. c_associated(tensor%c_ptr))
583 CALL torch_c_tensor_from_array_double (tensor=tensor%c_ptr, &
584 req_grad=
LOGICAL(my_req_grad, C_BOOL), &
588 cpassert(c_associated(tensor%c_ptr))
590 cpabort(
"CP2K compiled without the Torch library.")
593 mark_used(requires_grad)
595 END SUBROUTINE torch_tensor_from_array_double_2d
602 SUBROUTINE torch_tensor_data_ptr_double_2d(tensor, data_ptr)
604 REAL(dp),
DIMENSION(:, :),
POINTER :: data_ptr
606#if defined(__LIBTORCH)
607 INTEGER(kind=int_8),
DIMENSION(2) :: sizes_f, sizes_c
608 TYPE(c_ptr) :: data_ptr_c
611 SUBROUTINE torch_c_tensor_data_ptr_double (tensor, ndims, sizes, data_ptr) &
612 BIND(C, name="torch_c_tensor_data_ptr_double")
613 IMPORT :: c_char, c_ptr, c_int, c_int64_t
614 TYPE(c_ptr),
VALUE :: tensor
615 INTEGER(kind=C_INT),
VALUE :: ndims
616 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
617 TYPE(c_ptr) :: data_ptr
618 END SUBROUTINE torch_c_tensor_data_ptr_double
622 data_ptr_c = c_null_ptr
623 cpassert(c_associated(tensor%c_ptr))
624 cpassert(.NOT.
ASSOCIATED(data_ptr))
625 CALL torch_c_tensor_data_ptr_double (tensor=tensor%c_ptr, &
630 cpassert(all(sizes_c >= 0))
631 cpassert(c_associated(data_ptr_c))
633 sizes_f(1) = sizes_c(2)
634 sizes_f(2) = sizes_c(1)
635 CALL c_f_pointer(data_ptr_c, data_ptr, shape=sizes_f)
637 cpabort(
"CP2K compiled without the Torch library.")
641 END SUBROUTINE torch_tensor_data_ptr_double_2d
649 SUBROUTINE torch_tensor_from_array_float_3d(tensor, source, requires_grad)
651 REAL(sp),
DIMENSION(:, :, :),
ALLOCATABLE,
INTENT(IN) :: source
652 LOGICAL,
OPTIONAL,
INTENT(IN) :: requires_grad
654#if defined(__LIBTORCH)
655 INTEGER(kind=int_8),
DIMENSION(3) :: sizes_c
656 LOGICAL :: my_req_grad
659 SUBROUTINE torch_c_tensor_from_array_float (tensor, req_grad, ndims, sizes, source) &
660 BIND(C, name="torch_c_tensor_from_array_float")
661 IMPORT :: c_ptr, c_int, c_int64_t, c_float, c_double, c_bool
662 TYPE(c_ptr) :: tensor
663 LOGICAL(kind=C_BOOL),
VALUE :: req_grad
664 INTEGER(kind=C_INT),
VALUE :: ndims
665 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
666 REAL(kind=c_float),
DIMENSION(*) :: source
667 END SUBROUTINE torch_c_tensor_from_array_float
670 my_req_grad = .false.
671 IF (
PRESENT(requires_grad)) my_req_grad = requires_grad
673 sizes_c(1) =
SIZE(source, 3)
674 sizes_c(2) =
SIZE(source, 2)
675 sizes_c(3) =
SIZE(source, 1)
677 cpassert(.NOT. c_associated(tensor%c_ptr))
678 CALL torch_c_tensor_from_array_float (tensor=tensor%c_ptr, &
679 req_grad=
LOGICAL(my_req_grad, C_BOOL), &
683 cpassert(c_associated(tensor%c_ptr))
685 cpabort(
"CP2K compiled without the Torch library.")
688 mark_used(requires_grad)
690 END SUBROUTINE torch_tensor_from_array_float_3d
697 SUBROUTINE torch_tensor_data_ptr_float_3d(tensor, data_ptr)
699 REAL(sp),
DIMENSION(:, :, :),
POINTER :: data_ptr
701#if defined(__LIBTORCH)
702 INTEGER(kind=int_8),
DIMENSION(3) :: sizes_f, sizes_c
703 TYPE(c_ptr) :: data_ptr_c
706 SUBROUTINE torch_c_tensor_data_ptr_float (tensor, ndims, sizes, data_ptr) &
707 BIND(C, name="torch_c_tensor_data_ptr_float")
708 IMPORT :: c_char, c_ptr, c_int, c_int64_t
709 TYPE(c_ptr),
VALUE :: tensor
710 INTEGER(kind=C_INT),
VALUE :: ndims
711 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
712 TYPE(c_ptr) :: data_ptr
713 END SUBROUTINE torch_c_tensor_data_ptr_float
717 data_ptr_c = c_null_ptr
718 cpassert(c_associated(tensor%c_ptr))
719 cpassert(.NOT.
ASSOCIATED(data_ptr))
720 CALL torch_c_tensor_data_ptr_float (tensor=tensor%c_ptr, &
725 cpassert(all(sizes_c >= 0))
726 cpassert(c_associated(data_ptr_c))
728 sizes_f(1) = sizes_c(3)
729 sizes_f(2) = sizes_c(2)
730 sizes_f(3) = sizes_c(1)
731 CALL c_f_pointer(data_ptr_c, data_ptr, shape=sizes_f)
733 cpabort(
"CP2K compiled without the Torch library.")
737 END SUBROUTINE torch_tensor_data_ptr_float_3d
745 SUBROUTINE torch_tensor_from_array_int64_3d(tensor, source, requires_grad)
747 INTEGER(kind=int_8),
DIMENSION(:, :, :),
ALLOCATABLE,
INTENT(IN) :: source
748 LOGICAL,
OPTIONAL,
INTENT(IN) :: requires_grad
750#if defined(__LIBTORCH)
751 INTEGER(kind=int_8),
DIMENSION(3) :: sizes_c
752 LOGICAL :: my_req_grad
755 SUBROUTINE torch_c_tensor_from_array_int64 (tensor, req_grad, ndims, sizes, source) &
756 BIND(C, name="torch_c_tensor_from_array_int64")
757 IMPORT :: c_ptr, c_int, c_int64_t, c_float, c_double, c_bool
758 TYPE(c_ptr) :: tensor
759 LOGICAL(kind=C_BOOL),
VALUE :: req_grad
760 INTEGER(kind=C_INT),
VALUE :: ndims
761 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
762 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: source
763 END SUBROUTINE torch_c_tensor_from_array_int64
766 my_req_grad = .false.
767 IF (
PRESENT(requires_grad)) my_req_grad = requires_grad
769 sizes_c(1) =
SIZE(source, 3)
770 sizes_c(2) =
SIZE(source, 2)
771 sizes_c(3) =
SIZE(source, 1)
773 cpassert(.NOT. c_associated(tensor%c_ptr))
774 CALL torch_c_tensor_from_array_int64 (tensor=tensor%c_ptr, &
775 req_grad=
LOGICAL(my_req_grad, C_BOOL), &
779 cpassert(c_associated(tensor%c_ptr))
781 cpabort(
"CP2K compiled without the Torch library.")
784 mark_used(requires_grad)
786 END SUBROUTINE torch_tensor_from_array_int64_3d
793 SUBROUTINE torch_tensor_data_ptr_int64_3d(tensor, data_ptr)
795 INTEGER(kind=int_8),
DIMENSION(:, :, :),
POINTER :: data_ptr
797#if defined(__LIBTORCH)
798 INTEGER(kind=int_8),
DIMENSION(3) :: sizes_f, sizes_c
799 TYPE(c_ptr) :: data_ptr_c
802 SUBROUTINE torch_c_tensor_data_ptr_int64 (tensor, ndims, sizes, data_ptr) &
803 BIND(C, name="torch_c_tensor_data_ptr_int64")
804 IMPORT :: c_char, c_ptr, c_int, c_int64_t
805 TYPE(c_ptr),
VALUE :: tensor
806 INTEGER(kind=C_INT),
VALUE :: ndims
807 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
808 TYPE(c_ptr) :: data_ptr
809 END SUBROUTINE torch_c_tensor_data_ptr_int64
813 data_ptr_c = c_null_ptr
814 cpassert(c_associated(tensor%c_ptr))
815 cpassert(.NOT.
ASSOCIATED(data_ptr))
816 CALL torch_c_tensor_data_ptr_int64 (tensor=tensor%c_ptr, &
821 cpassert(all(sizes_c >= 0))
822 cpassert(c_associated(data_ptr_c))
824 sizes_f(1) = sizes_c(3)
825 sizes_f(2) = sizes_c(2)
826 sizes_f(3) = sizes_c(1)
827 CALL c_f_pointer(data_ptr_c, data_ptr, shape=sizes_f)
829 cpabort(
"CP2K compiled without the Torch library.")
833 END SUBROUTINE torch_tensor_data_ptr_int64_3d
841 SUBROUTINE torch_tensor_from_array_double_3d(tensor, source, requires_grad)
843 REAL(dp),
DIMENSION(:, :, :),
ALLOCATABLE,
INTENT(IN) :: source
844 LOGICAL,
OPTIONAL,
INTENT(IN) :: requires_grad
846#if defined(__LIBTORCH)
847 INTEGER(kind=int_8),
DIMENSION(3) :: sizes_c
848 LOGICAL :: my_req_grad
851 SUBROUTINE torch_c_tensor_from_array_double (tensor, req_grad, ndims, sizes, source) &
852 BIND(C, name="torch_c_tensor_from_array_double")
853 IMPORT :: c_ptr, c_int, c_int64_t, c_float, c_double, c_bool
854 TYPE(c_ptr) :: tensor
855 LOGICAL(kind=C_BOOL),
VALUE :: req_grad
856 INTEGER(kind=C_INT),
VALUE :: ndims
857 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
858 REAL(kind=c_double),
DIMENSION(*) :: source
859 END SUBROUTINE torch_c_tensor_from_array_double
862 my_req_grad = .false.
863 IF (
PRESENT(requires_grad)) my_req_grad = requires_grad
865 sizes_c(1) =
SIZE(source, 3)
866 sizes_c(2) =
SIZE(source, 2)
867 sizes_c(3) =
SIZE(source, 1)
869 cpassert(.NOT. c_associated(tensor%c_ptr))
870 CALL torch_c_tensor_from_array_double (tensor=tensor%c_ptr, &
871 req_grad=
LOGICAL(my_req_grad, C_BOOL), &
875 cpassert(c_associated(tensor%c_ptr))
877 cpabort(
"CP2K compiled without the Torch library.")
880 mark_used(requires_grad)
882 END SUBROUTINE torch_tensor_from_array_double_3d
889 SUBROUTINE torch_tensor_data_ptr_double_3d(tensor, data_ptr)
891 REAL(dp),
DIMENSION(:, :, :),
POINTER :: data_ptr
893#if defined(__LIBTORCH)
894 INTEGER(kind=int_8),
DIMENSION(3) :: sizes_f, sizes_c
895 TYPE(c_ptr) :: data_ptr_c
898 SUBROUTINE torch_c_tensor_data_ptr_double (tensor, ndims, sizes, data_ptr) &
899 BIND(C, name="torch_c_tensor_data_ptr_double")
900 IMPORT :: c_char, c_ptr, c_int, c_int64_t
901 TYPE(c_ptr),
VALUE :: tensor
902 INTEGER(kind=C_INT),
VALUE :: ndims
903 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
904 TYPE(c_ptr) :: data_ptr
905 END SUBROUTINE torch_c_tensor_data_ptr_double
909 data_ptr_c = c_null_ptr
910 cpassert(c_associated(tensor%c_ptr))
911 cpassert(.NOT.
ASSOCIATED(data_ptr))
912 CALL torch_c_tensor_data_ptr_double (tensor=tensor%c_ptr, &
917 cpassert(all(sizes_c >= 0))
918 cpassert(c_associated(data_ptr_c))
920 sizes_f(1) = sizes_c(3)
921 sizes_f(2) = sizes_c(2)
922 sizes_f(3) = sizes_c(1)
923 CALL c_f_pointer(data_ptr_c, data_ptr, shape=sizes_f)
925 cpabort(
"CP2K compiled without the Torch library.")
929 END SUBROUTINE torch_tensor_data_ptr_double_3d
940#if defined(__LIBTORCH)
941 CHARACTER(len=*),
PARAMETER :: routinen =
'torch_tensor_backward'
945 SUBROUTINE torch_c_tensor_backward(tensor, outer_grad) &
946 BIND(C, name="torch_c_tensor_backward")
947 IMPORT :: c_char, c_ptr
948 TYPE(c_ptr),
VALUE ::
tensor
949 TYPE(c_ptr),
VALUE :: outer_grad
950 END SUBROUTINE torch_c_tensor_backward
953 CALL timeset(routinen, handle)
954 cpassert(c_associated(
tensor%c_ptr))
955 cpassert(c_associated(outer_grad%c_ptr))
956 CALL torch_c_tensor_backward(
tensor=
tensor%c_ptr, outer_grad=outer_grad%c_ptr)
957 CALL timestop(handle)
959 cpabort(
"CP2K compiled without the Torch library.")
961 mark_used(outer_grad)
973#if defined(__LIBTORCH)
975 SUBROUTINE torch_c_tensor_grad(tensor, grad) &
976 BIND(C, name="torch_c_tensor_grad")
978 TYPE(c_ptr),
VALUE ::
tensor
980 END SUBROUTINE torch_c_tensor_grad
983 cpassert(c_associated(
tensor%c_ptr))
984 cpassert(.NOT. c_associated(grad%c_ptr))
985 CALL torch_c_tensor_grad(
tensor=
tensor%c_ptr, grad=grad%c_ptr)
986 cpassert(c_associated(grad%c_ptr))
988 cpabort(
"CP2K compiled without the Torch library.")
1001#if defined(__LIBTORCH)
1003 SUBROUTINE torch_c_tensor_release(tensor)
BIND(C, name="torch_c_tensor_release")
1005 TYPE(c_ptr),
VALUE ::
tensor
1006 END SUBROUTINE torch_c_tensor_release
1009 cpassert(c_associated(
tensor%c_ptr))
1011 tensor%c_ptr = c_null_ptr
1013 cpabort(
"CP2K was compiled without Torch library.")
1025#if defined(__LIBTORCH)
1027 SUBROUTINE torch_c_dict_create(dict)
BIND(C, name="torch_c_dict_create")
1030 END SUBROUTINE torch_c_dict_create
1033 cpassert(.NOT. c_associated(dict%c_ptr))
1034 CALL torch_c_dict_create(dict=dict%c_ptr)
1035 cpassert(c_associated(dict%c_ptr))
1037 cpabort(
"CP2K was compiled without Torch library.")
1048 CHARACTER(len=*),
INTENT(IN) :: key
1051#if defined(__LIBTORCH)
1054 SUBROUTINE torch_c_dict_insert(dict, key, tensor) &
1055 BIND(C, name="torch_c_dict_insert")
1056 IMPORT :: c_char, c_ptr
1057 TYPE(c_ptr),
VALUE :: dict
1058 CHARACTER(kind=C_CHAR),
DIMENSION(*) :: key
1059 TYPE(c_ptr),
VALUE ::
tensor
1060 END SUBROUTINE torch_c_dict_insert
1063 cpassert(c_associated(dict%c_ptr))
1064 cpassert(c_associated(
tensor%c_ptr))
1065 CALL torch_c_dict_insert(dict=dict%c_ptr, key=trim(key)//c_null_char,
tensor=
tensor%c_ptr)
1067 cpabort(
"CP2K compiled without the Torch library.")
1080 CHARACTER(len=*),
INTENT(IN) :: key
1083#if defined(__LIBTORCH)
1086 SUBROUTINE torch_c_dict_get(dict, key, tensor) &
1087 BIND(C, name="torch_c_dict_get")
1088 IMPORT :: c_char, c_ptr
1089 TYPE(c_ptr),
VALUE :: dict
1090 CHARACTER(kind=C_CHAR),
DIMENSION(*) :: key
1092 END SUBROUTINE torch_c_dict_get
1095 cpassert(c_associated(dict%c_ptr))
1096 cpassert(.NOT. c_associated(
tensor%c_ptr))
1097 CALL torch_c_dict_get(dict=dict%c_ptr, key=trim(key)//c_null_char,
tensor=
tensor%c_ptr)
1098 cpassert(c_associated(
tensor%c_ptr))
1101 cpabort(
"CP2K compiled without the Torch library.")
1115#if defined(__LIBTORCH)
1117 SUBROUTINE torch_c_dict_release(dict)
BIND(C, name="torch_c_dict_release")
1119 TYPE(c_ptr),
VALUE :: dict
1120 END SUBROUTINE torch_c_dict_release
1123 cpassert(c_associated(dict%c_ptr))
1124 CALL torch_c_dict_release(dict=dict%c_ptr)
1125 dict%c_ptr = c_null_ptr
1127 cpabort(
"CP2K was compiled without Torch library.")
1138 CHARACTER(len=*),
INTENT(IN) :: filename
1140#if defined(__LIBTORCH)
1141 CHARACTER(len=*),
PARAMETER :: routinen =
'torch_model_load'
1145 SUBROUTINE torch_c_model_load(model, filename)
BIND(C, name="torch_c_model_load")
1146 IMPORT :: c_ptr, c_char
1147 TYPE(c_ptr) :: model
1148 CHARACTER(kind=C_CHAR),
DIMENSION(*) :: filename
1149 END SUBROUTINE torch_c_model_load
1152 CALL timeset(routinen, handle)
1153 cpassert(.NOT. c_associated(model%c_ptr))
1154 CALL torch_c_model_load(model=model%c_ptr, filename=trim(filename)//c_null_char)
1155 cpassert(c_associated(model%c_ptr))
1156 CALL timestop(handle)
1158 cpabort(
"CP2K was compiled without Torch library.")
1173#if defined(__LIBTORCH)
1174 CHARACTER(len=*),
PARAMETER :: routinen =
'torch_model_forward'
1178 SUBROUTINE torch_c_model_forward(model, inputs, outputs)
BIND(C, name="torch_c_model_forward")
1180 TYPE(c_ptr),
VALUE :: model
1181 TYPE(c_ptr),
VALUE :: inputs
1182 TYPE(c_ptr),
VALUE :: outputs
1183 END SUBROUTINE torch_c_model_forward
1186 CALL timeset(routinen, handle)
1187 cpassert(c_associated(model%c_ptr))
1188 cpassert(c_associated(inputs%c_ptr))
1189 cpassert(c_associated(outputs%c_ptr))
1190 CALL torch_c_model_forward(model=model%c_ptr, inputs=inputs%c_ptr, outputs=outputs%c_ptr)
1191 CALL timestop(handle)
1193 cpabort(
"CP2K was compiled without Torch library.")
1207#if defined(__LIBTORCH)
1209 SUBROUTINE torch_c_model_release(model)
BIND(C, name="torch_c_model_release")
1211 TYPE(c_ptr),
VALUE :: model
1212 END SUBROUTINE torch_c_model_release
1215 cpassert(c_associated(model%c_ptr))
1216 CALL torch_c_model_release(model=model%c_ptr)
1217 model%c_ptr = c_null_ptr
1219 cpabort(
"CP2K was compiled without Torch library.")
1229 CHARACTER(len=*),
INTENT(IN) :: filename, key
1230 CHARACTER(:),
ALLOCATABLE :: res
1232#if defined(__LIBTORCH)
1233 CHARACTER(len=*),
PARAMETER :: routinen =
'torch_model_read_metadata'
1236 CHARACTER(LEN=1, KIND=C_CHAR),
DIMENSION(:), &
1237 POINTER :: content_f
1240 TYPE(c_ptr) :: content_c
1243 SUBROUTINE torch_c_model_read_metadata(filename, key, content, length) &
1244 BIND(C, name="torch_c_model_read_metadata")
1245 IMPORT :: c_char, c_ptr, c_int
1246 CHARACTER(kind=C_CHAR),
DIMENSION(*) :: filename, key
1247 TYPE(c_ptr) :: content
1248 INTEGER(kind=C_INT) :: length
1249 END SUBROUTINE torch_c_model_read_metadata
1252 CALL timeset(routinen, handle)
1253 content_c = c_null_ptr
1255 CALL torch_c_model_read_metadata(filename=trim(filename)//c_null_char, &
1256 key=trim(key)//c_null_char, &
1257 content=content_c, &
1259 cpassert(c_associated(content_c))
1260 cpassert(length >= 0)
1262 CALL c_f_pointer(content_c, content_f, shape=(/length + 1/))
1263 cpassert(content_f(length + 1) == c_null_char)
1265 ALLOCATE (
CHARACTER(LEN=length) :: res)
1267 cpassert(content_f(i) /= c_null_char)
1268 res(i:i) = content_f(i)
1271 DEALLOCATE (content_f)
1272 CALL timestop(handle)
1274 cpabort(
"CP2K was compiled without Torch library.")
1288#if defined(__LIBTORCH)
1290 FUNCTION torch_c_cuda_is_available()
BIND(C, name="torch_c_cuda_is_available")
1292 LOGICAL(C_BOOL) :: torch_c_cuda_is_available
1293 END FUNCTION torch_c_cuda_is_available
1296 res = torch_c_cuda_is_available()
1298 cpabort(
"CP2K was compiled without Torch library.")
1310 LOGICAL,
INTENT(IN) :: allow_tf32
1312#if defined(__LIBTORCH)
1314 SUBROUTINE torch_c_allow_tf32(allow_tf32)
BIND(C, name="torch_c_allow_tf32")
1316 LOGICAL(C_BOOL),
VALUE :: allow_tf32
1317 END SUBROUTINE torch_c_allow_tf32
1320 CALL torch_c_allow_tf32(allow_tf32=
LOGICAL(allow_tf32, c_bool))
1322 cpabort(
"CP2K was compiled without Torch library.")
1323 mark_used(allow_tf32)
1335#if defined(__LIBTORCH)
1336 CHARACTER(len=*),
PARAMETER :: routinen =
'torch_model_freeze'
1340 SUBROUTINE torch_c_model_freeze(model)
BIND(C, name="torch_c_model_freeze")
1342 TYPE(c_ptr),
VALUE :: model
1343 END SUBROUTINE torch_c_model_freeze
1346 CALL timeset(routinen, handle)
1347 cpassert(c_associated(model%c_ptr))
1348 CALL torch_c_model_freeze(model=model%c_ptr)
1349 CALL timestop(handle)
1351 cpabort(
"CP2K was compiled without Torch library.")
1361 SUBROUTINE torch_model_get_attr_int64 (model, key, dest)
1363 CHARACTER(len=*),
INTENT(IN) :: key
1364 INTEGER(kind=int_8),
INTENT(OUT) :: dest
1366#if defined(__LIBTORCH)
1369 SUBROUTINE torch_c_model_get_attr_int64 (model, key, dest) &
1370 BIND(C, name="torch_c_model_get_attr_int64")
1371 IMPORT :: c_ptr, c_char, c_int64_t, c_double
1372 TYPE(c_ptr),
VALUE :: model
1373 CHARACTER(kind=C_CHAR),
DIMENSION(*) :: key
1374 INTEGER(kind=C_INT64_T) :: dest
1375 END SUBROUTINE torch_c_model_get_attr_int64
1378 CALL torch_c_model_get_attr_int64 (model=model%c_ptr, &
1379 key=trim(key)//c_null_char, &
1382 cpabort(
"CP2K compiled without the Torch library.")
1387 END SUBROUTINE torch_model_get_attr_int64
1392 SUBROUTINE torch_model_get_attr_double (model, key, dest)
1394 CHARACTER(len=*),
INTENT(IN) :: key
1395 REAL(dp),
INTENT(OUT) :: dest
1397#if defined(__LIBTORCH)
1400 SUBROUTINE torch_c_model_get_attr_double (model, key, dest) &
1401 BIND(C, name="torch_c_model_get_attr_double")
1402 IMPORT :: c_ptr, c_char, c_int64_t, c_double
1403 TYPE(c_ptr),
VALUE :: model
1404 CHARACTER(kind=C_CHAR),
DIMENSION(*) :: key
1405 REAL(kind=c_double) :: dest
1406 END SUBROUTINE torch_c_model_get_attr_double
1409 CALL torch_c_model_get_attr_double (model=model%c_ptr, &
1410 key=trim(key)//c_null_char, &
1413 cpabort(
"CP2K compiled without the Torch library.")
1418 END SUBROUTINE torch_model_get_attr_double
1423 SUBROUTINE torch_model_get_attr_string (model, key, dest)
1425 CHARACTER(len=*),
INTENT(IN) :: key
1426 CHARACTER(LEN=default_string_length),
INTENT(OUT) :: dest
1428#if defined(__LIBTORCH)
1431 SUBROUTINE torch_c_model_get_attr_string (model, key, dest) &
1432 BIND(C, name="torch_c_model_get_attr_string")
1433 IMPORT :: c_ptr, c_char, c_int64_t, c_double
1434 TYPE(c_ptr),
VALUE :: model
1435 CHARACTER(kind=C_CHAR),
DIMENSION(*) :: key
1436 CHARACTER(kind=C_CHAR),
DIMENSION(*) :: dest
1437 END SUBROUTINE torch_c_model_get_attr_string
1440 CALL torch_c_model_get_attr_string (model=model%c_ptr, &
1441 key=trim(key)//c_null_char, &
1444 cpabort(
"CP2K compiled without the Torch library.")
1449 END SUBROUTINE torch_model_get_attr_string
1455 SUBROUTINE torch_model_get_attr_int32(model, key, dest)
1457 CHARACTER(len=*),
INTENT(IN) :: key
1458 INTEGER,
INTENT(OUT) :: dest
1460 INTEGER(kind=int_8) :: temp
1461 CALL torch_model_get_attr_int64(model, key, temp)
1462 cpassert(abs(temp) < huge(dest))
1464 END SUBROUTINE torch_model_get_attr_int32
1470 SUBROUTINE torch_model_get_attr_strlist(model, key, dest)
1472 CHARACTER(len=*),
INTENT(IN) :: key
1473 CHARACTER(LEN=default_string_length), &
1474 ALLOCATABLE,
DIMENSION(:) :: dest
1476#if defined(__LIBTORCH)
1478 INTEGER :: num_items, i
1481 SUBROUTINE torch_c_model_get_attr_list_size(model, key, size) &
1482 BIND(C, name="torch_c_model_get_attr_list_size")
1483 IMPORT :: c_ptr, c_char, c_int
1484 TYPE(c_ptr),
VALUE :: model
1485 CHARACTER(kind=C_CHAR),
DIMENSION(*) :: key
1486 INTEGER(kind=C_INT) :: size
1487 END SUBROUTINE torch_c_model_get_attr_list_size
1491 SUBROUTINE torch_c_model_get_attr_strlist(model, key, index, dest) &
1492 BIND(C, name="torch_c_model_get_attr_strlist")
1493 IMPORT :: c_ptr, c_char, c_int
1494 TYPE(c_ptr),
VALUE :: model
1495 CHARACTER(kind=C_CHAR),
DIMENSION(*) :: key
1496 INTEGER(kind=C_INT),
VALUE :: index
1497 CHARACTER(kind=C_CHAR),
DIMENSION(*) :: dest
1498 END SUBROUTINE torch_c_model_get_attr_strlist
1501 CALL torch_c_model_get_attr_list_size(model=model%c_ptr, &
1502 key=trim(key)//c_null_char, &
1504 ALLOCATE (dest(num_items))
1508 CALL torch_c_model_get_attr_strlist(model=model%c_ptr, &
1509 key=trim(key)//c_null_char, &
1515 cpabort(
"CP2K compiled without the Torch library.")
1521 END SUBROUTINE torch_model_get_attr_strlist
Defines the basic variable types.
integer, parameter, public int_8
integer, parameter, public dp
integer, parameter, public default_string_length
integer, parameter, public sp
subroutine, public torch_dict_release(dict)
Releases a Torch dictionary and all its ressources.
subroutine, public torch_tensor_backward(tensor, outer_grad)
Runs autograd on a Torch tensor.
subroutine, public torch_dict_get(dict, key, tensor)
Retrieves a Torch tensor from a Torch dictionary.
subroutine, public torch_model_load(model, filename)
Loads a Torch model from given "*.pth" file. (In Torch lingo models are called modules)
subroutine, public torch_dict_create(dict)
Creates an empty Torch dictionary.
subroutine, public torch_model_release(model)
Releases a Torch model and all its ressources.
subroutine, public torch_tensor_grad(tensor, grad)
Returns the gradient of a Torch tensor which was computed by autograd.
subroutine, public torch_allow_tf32(allow_tf32)
Set whether to allow the use of TF32. Needed due to changes in defaults from pytorch 1....
subroutine, public torch_model_freeze(model)
Freeze the given Torch model: applies generic optimization that speed up model. See https://pytorch....
character(:) function, allocatable, public torch_model_read_metadata(filename, key)
Reads metadata entry from given "*.pth" file. (In Torch lingo they are called extra files)
subroutine, public torch_dict_insert(dict, key, tensor)
Inserts a Torch tensor into a Torch dictionary.
logical function, public torch_cuda_is_available()
Returns true iff the Torch CUDA backend is available.
subroutine, public torch_tensor_release(tensor)
Releases a Torch tensor and all its ressources.
subroutine, public torch_model_forward(model, inputs, outputs)
Evaluates the given Torch model.