@@ -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.
@@ -139,6 +143,7 @@ pub fn valid_ret_activity(mode: DiffMode, activity: DiffActivity) -> bool {
139143 activity == DiffActivity :: Dual
140144 || activity == DiffActivity :: Dualv
141145 || activity == DiffActivity :: DualOnly
146+ || activity == DiffActivity :: DualvOnly
142147 || activity == DiffActivity :: Const
143148 }
144149 DiffMode :: Reverse => {
@@ -161,7 +166,7 @@ pub fn valid_ty_for_activity(ty: &P<Ty>, activity: DiffActivity) -> bool {
161166 if matches ! ( activity, Const ) {
162167 return true ;
163168 }
164- if matches ! ( activity, Dual | DualOnly | Dualv ) {
169+ if matches ! ( activity, Dual | DualOnly | Dualv | DualvOnly ) {
165170 return true ;
166171 }
167172 // FIXME(ZuseZ4) We should make this more robust to also
@@ -178,7 +183,7 @@ pub fn valid_input_activity(mode: DiffMode, activity: DiffActivity) -> bool {
178183 DiffMode :: Error => false ,
179184 DiffMode :: Source => false ,
180185 DiffMode :: Forward => {
181- matches ! ( activity, Dual | DualOnly | Dualv | Const )
186+ matches ! ( activity, Dual | DualOnly | Dualv | DualvOnly | Const )
182187 }
183188 DiffMode :: Reverse => {
184189 matches ! ( activity, Active | ActiveOnly | Duplicated | DuplicatedOnly | Const )
@@ -196,6 +201,7 @@ impl Display for DiffActivity {
196201 DiffActivity :: Dual => write ! ( f, "Dual" ) ,
197202 DiffActivity :: Dualv => write ! ( f, "Dualv" ) ,
198203 DiffActivity :: DualOnly => write ! ( f, "DualOnly" ) ,
204+ DiffActivity :: DualvOnly => write ! ( f, "DualvOnly" ) ,
199205 DiffActivity :: Duplicated => write ! ( f, "Duplicated" ) ,
200206 DiffActivity :: DuplicatedOnly => write ! ( f, "DuplicatedOnly" ) ,
201207 DiffActivity :: FakeActivitySize => write ! ( f, "FakeActivitySize" ) ,
@@ -228,6 +234,7 @@ impl FromStr for DiffActivity {
228234 "Dual" => Ok ( DiffActivity :: Dual ) ,
229235 "Dualv" => Ok ( DiffActivity :: Dualv ) ,
230236 "DualOnly" => Ok ( DiffActivity :: DualOnly ) ,
237+ "DualvOnly" => Ok ( DiffActivity :: DualvOnly ) ,
231238 "Duplicated" => Ok ( DiffActivity :: Duplicated ) ,
232239 "DuplicatedOnly" => Ok ( DiffActivity :: DuplicatedOnly ) ,
233240 _ => Err ( ( ) ) ,
0 commit comments