# Solve a routine economics PDE from an HJB w/ ModelingToolkit

**URL:** <https://discourse.julialang.org/t/solve-a-routine-economics-pde-from-an-hjb-w-modelingtoolkit/49718>\
**Category:** Modelling & Simulations\
**Tags:** economics, pde, finance\
**Created:** [November 7, 2020, 2:46am UTC](https://discourse.julialang.org/t/solve-a-routine-economics-pde-from-an-hjb-w-modelingtoolkit/49718 "2020-11-07T02:46:03Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![Albert\_Zevelev](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/albert_zevelev/32/11844_2.png) [@Albert\_Zevelev](https://discourse.julialang.org/u/Albert_Zevelev)\
**Post date:** [November 7, 2020, 2:46am UTC](https://discourse.julialang.org/t/solve-a-routine-economics-pde-from-an-hjb-w-modelingtoolkit/49718/1 "2020-11-07T02:46:03Z")

</div>

Consider a routine continuous time optimization problem from economics:  
V(t,a\_{t}) := \max \int\_{\tau=t}^{\tau = T} e^{-\rho (\tau -t)} u(c\_{\tau})d\tau \text{ s.t. }  
\dot{a}\_{t} = y + ra\_{t} - c\_{t},  
a\_{0} \text{ given, } a\_{T}=0.  
Assume y & r are constants and u(c)=\frac{c^{1-\gamma}}{1-\gamma}.

The problem has a known closed form solution:  
 ![image](https://global.discourse-cdn.com/julialang/original/3X/1/3/131836c950da9acf5c37e3fbc256bf5034667f56.png)  
Here I plot V(0,a\_{t}) and V(t,1):

 ![image](https://global.discourse-cdn.com/julialang/original/3X/5/a/5a735689f5cb268446848271f843f690723c95a0.png) ![image](https://global.discourse-cdn.com/julialang/original/3X/a/7/a721c26885727990586043474e5e5820fce13ccb.png)

To solve this using the HJB approach requires solving a PDE:  
\left[\begin{array}{l} \rho V(t,a\_{t}) = \frac{c\_{t}^{1-\gamma}}{1-\gamma} + V\_{a}(t,a\_{t})\times \left(y + ra\_{t} - c\_{t} \right) + V\_{t}(t,a\_{t}) \\ c(t,a\_{t}) = (V\_{a}(t,a\_{t}))^{-\frac{1}{\gamma}} \\ V(T,a\_{T}) = 0 \end{array} \right]

I’m trying to solve it w/ [ModelingToolkit](https://github.com/SciML/NeuralPDE.jl).jl, but it’s taking forever & not converging.

```julia
using NeuralPDE, Flux, ModelingToolkit, GalacticOptim, Optim, DiffEqFlux
using Plots

@parameters t a θ
@variables V(..)
@derivatives Da'~a
@derivatives Dt'~t

#
u(c,γ)= (c^(1.0 -γ))/(1.0 -γ);
γ = 2.00; ρ = 0.01; r = 0.01; y = 0.00; T = 5.0;
ω = r - (r-ρ)/γ;
# Closed form solution.
VS(t,a;y=y,r=r,γ=γ,ω=ω,T=T)=
    u(a+(y/r), γ) * ( (1.0 - exp(-ω*(T-t))) / ω )^γ;
# if r=ρ
CS(t,a;y=y,r=r,γ=γ,ω=ω,T=T, a0=1) = (r*a0)/(1.0 - exp(-r*T) )
AS(t,a;y=y,r=r,γ=γ,ω=ω,T=T, a0=1) =
    (a0)/(1.0 - exp(-r*T) ) +
    a0*(1.0 - 1.0/(1.0 - exp(-r*T) ) ) * exp(r*t);

plot( VS.(0.0,0.01:.01:5.0) )
plot( VS.(0.0:.01:5.0,1.0) )

#
v = V(t,a,θ);
va = max(eps(), Da(V(t,a,θ)) );
vt = Dt(V(t,a,θ));
c = (va)^(-1.0/γ);
#uc = u(c,γ)
uc = (va^(1.0 - 1.0/γ) )/(1.0 - γ);
# HJB
eq = ρ*v ~ uc + va*(y + r*a - c) + vt;

# Boundary conditions
bcs = [V(T,a,θ) ~ 0.0] #0.f0
# Space and time domains
domains = [t ∈ IntervalDomain(0.0,5.0),
           a ∈ IntervalDomain(0.0,5.0)]
# Discretization
dx = 0.1

# Neural network
dim = 2 # number of dimensions
chain = FastChain(FastDense(dim,16,Flux.σ),FastDense(16,16,Flux.σ),FastDense(16,1))
discretization = PhysicsInformedNN(dx,chain)

pde_system = PDESystem(eq,bcs,domains,[t,a],[V])
prob = discretize(pde_system,discretization)

cb = function (p,l)
    println("Current loss is: $l")
    return false
end

res = GalacticOptim.solve(prob, Flux.ADAM(); cb = cb, maxiters=10)
res = GalacticOptim.solve(prob, Optim.BFGS(); cb = cb, maxiters=10)

#
phi = discretization.phi
ts,as = [domain.domain.lower:dx/10:domain.domain.upper for domain in domains]
u_predict = reshape(
    [first(phi([t,a],res.minimizer)) for t in ts for a in as],
    (length(ts),length(as))
    )

# plot V(t=0,a) #u_predict[1,:]
plot(as, u_predict[1,:])  
# plot V(t, a=0.01)
plot(ts, u_predict[:,1])

```

1. it takes forever & is not accurate
2. originally I plugged in the exact equation but got an error

```julia
ERROR: DomainError with -0.05701087375174788:
Exponentiation yielding a complex result requires a complex argument.
Replace x^y with (x+0im)^y, Complex(x)^y, or similar.

```

1. the issue is the pde has terms like V\_{a}(t,a\_{t})^{-\frac{1}{\gamma}} and we have numerical problems related to dividing by zero or taking the root of negative numbers.  
We would like to use the prior knowledge that V\_{a}\>0.
2. following a suggestion @matthieu , I tried `max(eps(), va)^(-1/γ)`  
No more domain error, but it takes forever & is not accurate.

**Note** : if \gamma \>1 the trivial solution V(t,a\_{t})=0 also satisfies the PDE.  
It can be avoided w/ a bequest motive…

---

<div class="post-metadata">

**Author:** ![rveltz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rveltz/32/2707_2.png) [@rveltz](https://discourse.julialang.org/u/rveltz)\
**Post date:** [November 7, 2020, 7:38am UTC](https://discourse.julialang.org/t/solve-a-routine-economics-pde-from-an-hjb-w-modelingtoolkit/49718/2 "2020-11-07T07:38:43Z")

</div>

dont you need a boundary condition?

---

<div class="post-metadata">

**Author:** ![Albert\_Zevelev](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/albert_zevelev/32/11844_2.png) [@Albert\_Zevelev](https://discourse.julialang.org/u/Albert_Zevelev)\
**Post date:** [November 7, 2020, 8:33am UTC](https://discourse.julialang.org/t/solve-a-routine-economics-pde-from-an-hjb-w-modelingtoolkit/49718/3 "2020-11-07T08:33:36Z")

</div>

@rveltz yes.  
It’s V(T,a\_{T})=0 for the unknown function V(t,a\_{t}).  
In the code `bcs = [V(T,a,θ) ~ 0.0]`.

That said, most successful attempts to solve HJBs use [viscocity solutions](https://benjaminmoll.com/wp-content/uploads/2019/07/viscosity_slides.pdf)…

---

<div class="post-metadata">

**Author:** ![rveltz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rveltz/32/2707_2.png) [@rveltz](https://discourse.julialang.org/u/rveltz)\
**Post date:** [November 7, 2020, 9:00am UTC](https://discourse.julialang.org/t/solve-a-routine-economics-pde-from-an-hjb-w-modelingtoolkit/49718/4 "2020-11-07T09:00:42Z")

</div>

> [@Albert\_Zevelev](#):
>
> That said, most successful attempts to solve HJBs use [viscocity solutions](https://benjaminmoll.com/wp-content/uploads/2019/07/viscosity_slides.pdf)…

Does the numerical algo implements the ideas behind viscosity solutions?

---

<div class="post-metadata">

**Author:** ![Albert\_Zevelev](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/albert_zevelev/32/11844_2.png) [@Albert\_Zevelev](https://discourse.julialang.org/u/Albert_Zevelev)\
**Post date:** [November 7, 2020, 9:22am UTC](https://discourse.julialang.org/t/solve-a-routine-economics-pde-from-an-hjb-w-modelingtoolkit/49718/5 "2020-11-07T09:22:47Z")

</div>

You’ll have to ask the people who created the package…  
I know the code uses a [new gen of methods](https://www.pnas.org/content/115/34/8505) that solves pdes w/ Neural Networks.  
Those methods have been shown to be very successful at solving high-dim HJB equations.  
I also know that the package is still in it’s early phase.

To clarify, I’m trained as an economist (my undergrad was in math but no PDEs).  
That means I know how to set up a problem that boils down to a pde, but I count on experts to make solvers where I can plug in my PDE (do a little tuning) and voila.

I’ve used Mathematica & a few others. I wanna switch to Julia.

---

<div class="post-metadata">

**Author:** ![Tamas\_Papp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamas_papp/32/25949_2.png) [@Tamas\_Papp](https://discourse.julialang.org/u/Tamas_Papp)\
**Post date:** [November 8, 2020, 1:08pm UTC](https://discourse.julialang.org/t/solve-a-routine-economics-pde-from-an-hjb-w-modelingtoolkit/49718/6 "2020-11-08T13:08:28Z")

</div>

> [@Albert\_Zevelev](#):
>
> That said, most successful attempts to solve HJBs use [viscocity solutions](https://benjaminmoll.com/wp-content/uploads/2019/07/viscosity_slides.pdf)…

I am not quite sure about this, but in any case for the above problem a spectral method (eg Chebyshev polynomials) should be very accurate and super-fast (either limit the domain to a relevant interval [recommended], or transform [-1,1] to \mathbb{R}).

A [change of variables](https://www.sas.upenn.edu/~jesusfv/change_variables.pdf) can improve on this even further.

---

<div class="post-metadata">

**Author:** ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)\
**Post date:** [November 8, 2020, 5:56pm UTC](https://discourse.julialang.org/t/solve-a-routine-economics-pde-from-an-hjb-w-modelingtoolkit/49718/7 "2020-11-08T17:56:08Z")

</div>

I think I just mentioned this somewhere else too. If you know the solution is positive, then force it.

```julia
FastChain(FastDense(dim,16,Flux.σ),FastDense(16,16,Flux.σ),FastDense(16,1),(x,p)->x^2)

```

That’s a neural network that is a universal approximator for positive functions.

---

<div class="post-metadata">

**Author:** ![Albert\_Zevelev](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/albert_zevelev/32/11844_2.png) [@Albert\_Zevelev](https://discourse.julialang.org/u/Albert_Zevelev)\
**Post date:** [November 8, 2020, 9:12pm UTC](https://discourse.julialang.org/t/solve-a-routine-economics-pde-from-an-hjb-w-modelingtoolkit/49718/8 "2020-11-08T21:12:00Z")

</div>

Sorry I wasn’t clear.  
The solution to the PDE V(t,a\_{t}) is not positive in general (see plots in my original post above).

I know that c\>0, and since V\_{a}(t,a\_{t})=c^{-\gamma} and \gamma\>0, we will have V\_{a}(t,a\_{t})\>0.

I don’t know how to incorporate this information (V\_{a}(t,a\_{t})\>0).

---

<div class="post-metadata">

**Author:** ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)\
**Post date:** [November 9, 2020, 1:24am UTC](https://discourse.julialang.org/t/solve-a-routine-economics-pde-from-an-hjb-w-modelingtoolkit/49718/9 "2020-11-09T01:24:30Z")

</div>

So you’re looking for a monotonic neural network?

---

<div class="post-metadata">

**Author:** ![Albert\_Zevelev](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/albert_zevelev/32/11844_2.png) [@Albert\_Zevelev](https://discourse.julialang.org/u/Albert_Zevelev)\
**Post date:** [November 9, 2020, 1:59am UTC](https://discourse.julialang.org/t/solve-a-routine-economics-pde-from-an-hjb-w-modelingtoolkit/49718/10 "2020-11-09T01:59:43Z")

</div>

Yes, in this case, I know that the unknown function V(t,a\_{t}) is monotonically increasing in both it’s arguments. (is that what you’re asking?)

The PDE that needs to be solved:  
\left[\begin{array}{l} \rho V(t,a\_{t}) = \frac{ (V\_{a} )^{\frac{\gamma-1}{\gamma}}}{1-\gamma} + V\_{a}(t,a\_{t})\times \left(y + ra\_{t} - (V\_{a})^{-\frac{1}{\gamma}} \right) + V\_{t}(t,a\_{t}) \\ V(T,a\_{T}) = 0 \end{array} \right]

In my example \gamma =2  
\left[\begin{array}{l} \rho V(t,a\_{t}) = -(V\_{a} )^{\frac{1}{2}} + V\_{a}(t,a\_{t})\times \left(y + ra\_{t} - (V\_{a})^{-\frac{1}{2}} \right) + V\_{t}(t,a\_{t}) \\ V(T,a\_{T}) = 0 \end{array} \right]  
The problem is the term (V\_{a})^{-\frac{1}{2}} .  
I just want it to know that V\_a \>0 so it doesn’t worry about dividing by zero or taking roots of negative numbers…

---

<div class="post-metadata">

**Author:** ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)\
**Post date:** [November 9, 2020, 2:17am UTC](https://discourse.julialang.org/t/solve-a-routine-economics-pde-from-an-hjb-w-modelingtoolkit/49718/11 "2020-11-09T02:17:56Z")

</div>

Yes. So you’d be looking for a monotonic neural network. I don’t exactly know of an architecture that gives that, but that’s what you’re looking for.

---

<div class="post-metadata">

**Author:** ![jlperla](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jlperla/32/34332_2.png) [@jlperla](https://discourse.julialang.org/u/jlperla)\
**Post date:** [November 9, 2020, 6:20pm UTC](https://discourse.julialang.org/t/solve-a-routine-economics-pde-from-an-hjb-w-modelingtoolkit/49718/12 "2020-11-09T18:20:29Z")

</div>

It doesn’t really work to discretize this way in general, though it can sometimes in specific circumstances. The issue is that control problems have a very peculiar backwards/forwards structure, which leads to specialized discretization schemes where some parts of the equation are discreitized forwards and others backwards. Then things converge to the viscosity solution. Not to say that other approaches can’t work, but the convergence of these things is very complicated… You can’t just throw equations at an optimizer.

With spectral-style methods (or just using a neural network with a function) rather than finite difference methods you probably can get away just minimizing residuals with all of your equations with some neural network approximation, but I can say with experience that they are very finicky for HJBE problems with a control. Boundary conditions are tricky… If you want to do transition dynamics without a control choice, in which case it is kind of like a HJBE without much of an “H”, then you can use simpler discretizations.

For something along the lines of what you are describing I think it is a little premature in terms of the theory. For one thing, you are describing a finite time-horizon setup, which is of limited usefulness to most economists, but mostly it is that there is a vast literature on this due to the peculiarities of these equations. Also, I think it very unlikely that neural networks will beat the standard algorithms (e.g. [codes - HACT - Benjamin Moll - University of Princeton](https://benjaminmoll.com/codes/) ) for this dimensionality.

---

<div class="post-metadata">

**Author:** ![anon92994695](https://avatars.discourse-cdn.com/v4/letter/a/ce7236/32.png) [@anon92994695](https://discourse.julialang.org/u/anon92994695)\
**Post date:** [November 9, 2020, 7:19pm UTC](https://discourse.julialang.org/t/solve-a-routine-economics-pde-from-an-hjb-w-modelingtoolkit/49718/13 "2020-11-09T19:19:10Z")

</div>

Not sure if this helps or confuses. I have some code for monotonic regression. Might have a bug or something, doubtful it’s differentiable. Pretty sure it’s an active set optimization - but it’s been a while since I’ve looked…  
[https://github.com/caseykneale/ChemometricsTools.jl/blob/cf53867beb273bffc6deb22d8d060a09c68278ae/src/RegressionModels.jl#L273](https://github.com/caseykneale/ChemometricsTools.jl/blob/cf53867beb273bffc6deb22d8d060a09c68278ae/src/RegressionModels.jl#L273)

---

<div class="post-metadata">

**Author:** ![Tamas\_Papp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamas_papp/32/25949_2.png) [@Tamas\_Papp](https://discourse.julialang.org/u/Tamas_Papp)\
**Post date:** [November 10, 2020, 7:54am UTC](https://discourse.julialang.org/t/solve-a-routine-economics-pde-from-an-hjb-w-modelingtoolkit/49718/14 "2020-11-10T07:54:59Z")

</div>

> [@jlperla](#):
>
> spectral-style methods […] are very finicky for HJBE problems with a control

My experience is the opposite: they are fast, especially if you get a good initial guess (from the previous set of parameters if you are estimating, or some trick like [consistent future approximations](http://www.centreformacroeconomics.ac.uk/Discussion-Papers/2015/CFMDP2015-36-Paper.pdf)), and very accurate. They are also simple to implement (basically working through Miranda-Fackler makes you a black-belt HJB ninja).

In contrast, treating a HJBE like a PDE and discretizing is something that I never manage to implement reliably. The problem is not that I cannot get it working for _one_ set of parameters, but when I am estimating a model it has to work for all sorts of wacky parameters all the time.

---

<div class="post-metadata">

**Author:** ![jlperla](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jlperla/32/34332_2.png) [@jlperla](https://discourse.julialang.org/u/jlperla)\
**Post date:** [November 10, 2020, 8:36pm UTC](https://discourse.julialang.org/t/solve-a-routine-economics-pde-from-an-hjb-w-modelingtoolkit/49718/15 "2020-11-10T20:36:53Z")

</div>

Certainly they are amazing in discrete time, and for stationary problems in continuous time (with simple enough boundary conditions). My issues might have all come down to boundary conditions.

But if you have non-stationary problems (i.e. the terminal `T` in the quetsion he asked) then I am not sure if Miranda-Fackler has examples for bellmans/stochastic control? Do you go spectral in time? I am not sure what they would suggest for PDEs rather than the stationary ODEs.

But @Albert_Zevelev he is 100% right to start with Miranda and Fackler for this. In some ways, I think it is best to think of the neural network stuff as more similar to the collocation approaches than finite-differences… but there may be different ways to set it up.

But don’t forget that one of the requirements for these sorts of spectral or collocation based approaches is taking the derivative of the function you are approximating with. With a polynomial basis this is easy (especially using compecon) but with neural networks you would need to get the derivative. No problem, **but** then you also need to differentiate that to get the gradients to minimize the loss. So you need to do reverse over forward diff or something. Not impossible, but this would take tinkering and the convergence properties will end up being original research, were I to guess.

---

<div class="post-metadata">

**Author:** ![Tamas\_Papp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamas_papp/32/25949_2.png) [@Tamas\_Papp](https://discourse.julialang.org/u/Tamas_Papp)\
**Post date:** [November 11, 2020, 7:26am UTC](https://discourse.julialang.org/t/solve-a-routine-economics-pde-from-an-hjb-w-modelingtoolkit/49718/16 "2020-11-11T07:26:12Z")

</div>

> [@jlperla](#):
>
> Do you go spectral in time?

Personally I don’t have a lot of experience with these models, but yes, I have seen people do this.

> [@jlperla](#):
>
> this would take tinkering and the convergence properties will end up being original research, were I to guess

But of course — that’s what always happens. It will consume 97% of the time spent on the project, and end up in the appendix in a very shortened form 😉

---

<div class="post-metadata">

**Author:** ![rveltz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rveltz/32/2707_2.png) [@rveltz](https://discourse.julialang.org/u/rveltz)\
**Post date:** [November 11, 2020, 9:45am UTC](https://discourse.julialang.org/t/solve-a-routine-economics-pde-from-an-hjb-w-modelingtoolkit/49718/17 "2020-11-11T09:45:22Z")

</div>

Do you have example of code where this is done?

---

<div class="post-metadata">

**Author:** ![sgjanssens](https://avatars.discourse-cdn.com/v4/letter/s/9f8e36/32.png) [@sgjanssens](https://discourse.julialang.org/u/sgjanssens)\
**Post date:** [November 11, 2020, 12:24pm UTC](https://discourse.julialang.org/t/solve-a-routine-economics-pde-from-an-hjb-w-modelingtoolkit/49718/18 "2020-11-11T12:24:31Z")

</div>

> [@Tamas\_Papp](#):
>
> But of course — that’s what always happens. It will consume 97% of the time spent on the project, and end up in the appendix in a very shortened form 😉

About this I am not sure. New and rigorous convergence proofs have a more prominent place in the numerical analysis literature. (Whether in this case such a proof would indeed be new, I cannot judge. It is not my field.) If you can demonstrate convergence _and_ apply it to an interesting class of problems, it is even better, of course.

---

<div class="post-metadata">

**Author:** ![Tamas\_Papp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamas_papp/32/25949_2.png) [@Tamas\_Papp](https://discourse.julialang.org/u/Tamas_Papp)\
**Post date:** [November 11, 2020, 1:25pm UTC](https://discourse.julialang.org/t/solve-a-routine-economics-pde-from-an-hjb-w-modelingtoolkit/49718/19 "2020-11-11T13:25:16Z")

</div>

> [@sgjanssens](#):
>
> New and rigorous convergence proofs have a more prominent place in the numerical analysis literature.

That may be, but unfortunately general equilibrium problems in economics are quite badly behaved, so most methods are _ad hoc_ (“we did that, and it worked”). Also, from reading what people use in physics, the applications are about 2 decades behind.

---

<div class="post-metadata">

**Author:** ![Tamas\_Papp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamas_papp/32/25949_2.png) [@Tamas\_Papp](https://discourse.julialang.org/u/Tamas_Papp)\
**Post date:** [November 12, 2020, 10:40am UTC](https://discourse.julialang.org/t/solve-a-routine-economics-pde-from-an-hjb-w-modelingtoolkit/49718/20 "2020-11-12T10:40:21Z")

</div>

> [@rveltz](#):
>
> Do you have example of code where this is done?

I have seen it at a conference a couple of years ago, tried to find it but couldn’t, sorry. But it would not help with Julia code either I guess (this was years ago).

But I see no reason why approximating V(t, a) with Chebyshev polynomials (tensored, or Smolyak if you want to be really fancy) shouldn’t just work. I would just deal with the possible sign problem with \max(V\_a, 0), or a [smooth maximum](https://en.wikipedia.org/wiki/LogSumExp) with small scale to get an initial solution near the correct one.

[Next page](https://discourse.julialang.org/t/solve-a-routine-economics-pde-from-an-hjb-w-modelingtoolkit/49718.md?page=2)
