@@ -56,6 +56,10 @@ pub enum DiffActivity {
5656 /// Forward Mode, Compute derivatives for this input/output and *overwrite* the shadow argument
5757 /// with it. Drop the code which updates the original input/output for maximum performance.
5858 DualOnly ,
59+ /// Forward Mode, Compute derivatives for this input/output and *overwrite* the shadow argument
60+ /// with it. Drop the code which updates the original input/output for maximum performance.
61+ /// It expects the shadow argument to be `width` times larger than the original input/output.
62+ DualvOnly ,
5963 /// Reverse Mode, Compute derivatives for this &T or *T input and *add* it to the shadow argument.
6064 Duplicated ,
6165 /// Reverse Mode, Compute derivatives for this &T or *T input and *add* it to the shadow argument.
@@ -133,6 +137,7 @@ pub fn valid_ret_activity(mode: DiffMode, activity: DiffActivity) -> bool {
133137 activity == DiffActivity :: Dual
134138 || activity == DiffActivity :: Dualv
135139 || activity == DiffActivity :: DualOnly
140+ || activity == DiffActivity :: DualvOnly
136141 || activity == DiffActivity :: Const
137142 }
138143 DiffMode :: Reverse => {
@@ -155,7 +160,7 @@ pub fn valid_ty_for_activity(ty: &P<Ty>, activity: DiffActivity) -> bool {
155160 if matches ! ( activity, Const ) {
156161 return true ;
157162 }
158- if matches ! ( activity, Dual | DualOnly | Dualv ) {
163+ if matches ! ( activity, Dual | DualOnly | Dualv | DualvOnly ) {
159164 return true ;
160165 }
161166 // FIXME(ZuseZ4) We should make this more robust to also
@@ -172,7 +177,7 @@ pub fn valid_input_activity(mode: DiffMode, activity: DiffActivity) -> bool {
172177 DiffMode :: Error => false ,
173178 DiffMode :: Source => false ,
174179 DiffMode :: Forward => {
175- matches ! ( activity, Dual | DualOnly | Dualv | Const )
180+ matches ! ( activity, Dual | DualOnly | Dualv | DualvOnly | Const )
176181 }
177182 DiffMode :: Reverse => {
178183 matches ! ( activity, Active | ActiveOnly | Duplicated | DuplicatedOnly | Const )
@@ -190,6 +195,7 @@ impl Display for DiffActivity {
190195 DiffActivity :: Dual => write ! ( f, "Dual" ) ,
191196 DiffActivity :: Dualv => write ! ( f, "Dualv" ) ,
192197 DiffActivity :: DualOnly => write ! ( f, "DualOnly" ) ,
198+ DiffActivity :: DualvOnly => write ! ( f, "DualvOnly" ) ,
193199 DiffActivity :: Duplicated => write ! ( f, "Duplicated" ) ,
194200 DiffActivity :: DuplicatedOnly => write ! ( f, "DuplicatedOnly" ) ,
195201 DiffActivity :: FakeActivitySize => write ! ( f, "FakeActivitySize" ) ,
@@ -222,6 +228,7 @@ impl FromStr for DiffActivity {
222228 "Dual" => Ok ( DiffActivity :: Dual ) ,
223229 "Dualv" => Ok ( DiffActivity :: Dualv ) ,
224230 "DualOnly" => Ok ( DiffActivity :: DualOnly ) ,
231+ "DualvOnly" => Ok ( DiffActivity :: DualvOnly ) ,
225232 "Duplicated" => Ok ( DiffActivity :: Duplicated ) ,
226233 "DuplicatedOnly" => Ok ( DiffActivity :: DuplicatedOnly ) ,
227234 _ => Err ( ( ) ) ,
0 commit comments