25 assert(input.ndim() >= 1 &&
"operator `Linear` requires non-scalar input");
26 assert(weight.ndim() == 2 &&
"operator `Linear` requires 2D `weight`");
27 assert(input.size(-1) == weight.size(-1) &&
28 "operator `Linear` input features must match `weight`");
29 assert(out.ndim() == input.ndim() &&
30 "operator `Linear` output rank must match input rank");
31 assert(out.size(-1) == weight.size(0) &&
32 "operator `Linear` output features must match `weight`");
34 for (Tensor::Size axis = 0; axis + 1 < input.ndim(); ++axis) {
35 assert(input.size(axis) == out.size(axis) &&
36 "operator `Linear` output leading dimensions must match input");
39 assert(input.dtype() == weight.dtype() &&
40 "operator `Linear` requires input and weight to have the same "
42 assert(input.dtype() == out.dtype() &&
43 "operator `Linear` requires output to have the input dtype");
45 assert(bias->ndim() == 1 && bias->size(0) == weight.size(0) &&
46 "operator `Linear` bias must have shape `[out_features]`");
47 assert(bias->dtype() == out.dtype() &&
48 "operator `Linear` requires bias to have the output dtype");