SQPpro -Un solveur de problèmes d'optimisation non linéaire, fondé sur l'approche SQP Version 0.5 (Juin 2009)

Résumé : SQPpro est un code destiné à minimiser une fonction non linéaire sous des contraintes non linéaires d'égalité et d'inégalité. Les fonctions définissant le problème doivent être au moins différentiables. L'algorithme implémenté utilise l'approche SQP, qui est une version réalisable des algorithmes de Newton et quasi-Newton. Le problème quadratique qui se pose à chaque itération est résolu par le solveur QPAL. Les matrices jacobiennes des contraintes peuvent être stockées dans des tructures denses ou creuses ; de plus le hessien du lagrangien peut être approché au moyen des formules de BFGS (pleine) ou ℓ-BFGS (creuse). SQPpro est écrit en Fortran-2003.

Mots-clés : algorithme SQP, méthodes de Newton et de quasi-Newton, mises à jour de BFGS et ℓ-BFGS, optimisation non linéaire, solveur de problème quadratique QPAL. SQPpro (pronounce S-Q-P-pro) has been designed to solve a general nonlinear optimization problem in x ∈ R n of the form

(P EI )    min f (x) l (x, c I (x)) u c E (x) = 0, (1.1)
where f : R n → R is the objective of the problem, c I : R n → R mI is the inequality constraint function, and c E : R n → R mE is the equality constraint function. These functions are supposed smooth, possibly nonlinear and nonconvex. Smoothness means here that the functions must be once differentiable; first derivatives are indeed used by the solver. The notation l (x, c I (x)) u expresses in compact form bound constraints on x and on c I (x). The bound vectors l and u ∈ Rn+mI can have components with infinite values ±∞ (the corresponding bounds are ineffective in that case), but must satisfy l < u, meaning that l i < u i for all indices i. As a result, the inequality constraints cannot be used to model equality constraints by taking identical lower and upper bounds; the constraint function c E must be used instead to introduce equality constraints.

RT n°0378 inria-00442314, version -Dec

SQPpro is flexible with respect to the memory representation of the constraint Jacobian matrices c ′ I (x) and c ′ E (x). Indeed, these may be dense or sparse. Sparse matrices are represented by the row-column indices of the nonzero elements, as well as the values of these elements.

To be concise, it is convenient to denote by B := {1, . . . , n} the index set of the variables x and by c B (x) ≡ x the identity on R n . We also use the function c : R n → R m , m := n + m I + m E , defined at x ∈ R n by c(x) := (c B (x), c I (x), c E (x)) ∈ R n × R mI × R mE .

The feasible set of problem (P EI ) is denoted

X := {x ∈ R n : l c B∪I (x) u, c E (x) = 0}.
A point x belonging to X, hence satisfying the constraints of problem (P EI ) is said feasible.

SQPpro is written in ANSI Fortran 2003 (F03 for short), using double precision. The code uses this feature of F03 that makes possible calling a subroutine with a structure argument having components that are not yet allocated when the subroutine is called. SQPpro compiles with gfortran [5], version "4.4.0 20090321 (experimental)" or higher.

Detecting optimality

The Lagrangian of problem (P EI ) is the function ℓ

: R n × R m → R defined at (x, λ) by ℓ(x, λ) = f (x) + λ ⊤ c(x).
This one is useful to write the KKT optimality conditions of problem (P EI ) (see [2] for instance). If x is a solution to (P EI ) and if the constraints are qualified at x, there exists a vector λ ∈ R m such that:

   (a) ∇ x ℓ(x, λ) = 0 (b) l (x, c I (x)) u and c E (x) = 0 (c) ∀i ∈ B ∪ I : λ - i (l i -c i (x)) = λ + i (c i (x) -u i ) = 0, (1.2)
where t + := max(t, 0) and t -:= max(-t, 0) for t ∈ R and () + and () -act componentwise for vectors. In (c), infinite bounds are replaced by large numbers of the same sign, so that λ i must be nonnegative when l i = -∞ and u i is finite. The first condition refers to the proper optimality, the second one to the feasibility, and the third one is known as the complementarity conditions. The components of the vector λ in this equation are called the optimal KKT multipliers or the dual solutions or the marginal costs.

The SQPpro solver cannot guarantee to find a local minimum of problem (P EI ) (even less a global minimum), but is designed to find a stationary point, which is a pair (x, λ) ∈ R n × R m satisfying (1.2). Often, a stationary point is a solution to (P EI ).

Brief description of the method

SQPpro implements a sequential quadratic programming algorithm, using an augmented Lagrangian approach for solving the osculating quadratic problems and linesearch for its globalization. It is therefore a primal-dual algorithm, meaning that it generates the primal variables x and the dual variables λ, independently.

One iteration of the SQP algorithm consists in solving the osculating quadratic problem (QP), which at the current iterate (x, λ) ∈ R n × R m reads (we drop the dependence of the functions in (x, λ) for more concision):

     min d∈R n g ⊤ d + 1 2 d ⊤ M d l (d, A I d) ũ c E + A E d = 0, (1.3)
where g stands fo the gradient ∇f (x), M is an approximation of the Hessian of the Lagrangian

L := ∇ 2 xx ℓ(x, λ), A I := c ′ I (x), A E := c ′ E (x), l = l -c B∪I (x)
, and ũ := uc B∪I (x). It is classical to impose the positive semi-definiteness of M (even though L does not have that property), in order to avoid a QP that, otherwise, would be NP-hard. The osculating QP is then convex. In SQPpro, the solution to this QP is obtained by the solver QPAL (version 0.6.1) [START_REF] Delbos | Global linear convergence of an augmented Lagrangian algorithm for solving convex quadratic optimization problems[END_REF][START_REF] Ch | QPAL -A solver of convex quadratic optimization problems, using an augmented Lagrangian approach -Version 0.6.1[END_REF]. If (d, λ QP ) is a primal-dual solution to (1.3), the new iterate (x + , λ + ) is obtained by

x + = x + α d and λ + = λ + α (λ QP -λ),
where α ∈ ]0, 1] is a stepsize determined by linesearch.

The approximation M ∈ R n×n of the Hessian of the Lagrangian or its inverse (for unconstrained problems) is a matrix updated by the BFGS or ℓ-BFGS formula. The Jacobian matrices A I and A E can be stored in dense or sparse data structures.

The SQP algorithm is described in part III of [2], where other references can be found. The combination of the SQP algorithm and the augmented Lagrangian approach for solving the osculating quadratic problems is described in [4], where it is also applied to a seismic reflection tomography problem, and studied in [START_REF] Delbos | Global linear convergence of an augmented Lagrangian algorithm for solving convex quadratic optimization problems[END_REF],

1.4 The package

Description

The SQPpro package is formed of the files and directories described below. In this description, $PLAT is the value of the environment variable that designates the platform for which the software has to be compiled; see the description of the file make.a platform below and stage 2 of the installation procedure in section 1.4.2.

• The files COPYRIGHT.* give the conditions of use of the software. You are supposed to agree with these conditions to be authorized to use it. If this has not been done yet, send a filled in and signed copy of the commitment letter COPYRIGHT.pdf to the author of the software.

• The directory bin is originally empty and will contain the binaries gathered in libraries, named lib*.a, after compilation of SQPpro:

libblas.$PLAT.a contains the blas routines used in SQPpro, those in the directory blas of the QPAL solver; this archive can be used if the compiler does not provide a blas library; liblapack.$PLAT.a contains the lapack routines used in SQPpro, those in the directory lapack of the QPAL solver; this archive can be used if the compiler does not provide a lapack library; libqpal.$PLAT.a contains the routines peculiar to the QP solver QPAL [START_REF] Ch | QPAL -A solver of convex quadratic optimization problems, using an augmented Lagrangian approach -Version 0.6.1[END_REF], which is used in SQPpro; libsqppro.$PLAT.a contains the routines peculiar to SQPpro, those in the directory src (see below).

• The directory cuter contains all the files that are useful to install SQPpro in CUTEr [START_REF] Bongartz | CUTE: Constrained and unconstrained testing environment[END_REF][START_REF] Gould | CUTEr (and SifDec), a Constrained and Unconstrained Testing Environment, revisited[END_REF]; see how to proceed in the README file of the cuter directory.

• The directory doc contains several interesting files: -VERSIONS.txt briefly describes the successive versions of the software; doc.pdf is this documentation in PDF; sqppro.spc is an example of specification file for the solver, containing explanations on how to build such a file.

• The directory example gives elementary examples of nonlinear optimization problem, that are solved by SQPpro. The goal of these examples is to make concrete the way of encoding the problem and to call the SQP solver.

RT n°0378

inria-00442314, version 1 -19 Dec 2009

• The directory libopt contains all the files that are useful to install SQPpro in the Libopt environment [START_REF] Gilbert | LIBOPT -An environment for testing solvers on heterogeneous collections of problems[END_REF]; see how to proceed in the README file of the libopt directory.

• The file make.a platform is an example of make.$PLAT file that is used by the Makefile's of the package to compile various programs. You will probably need to adapt this file to your own platform, by redefining some of its variables. Stage 2 in section 1.4.2 gives the details.

• The directory mod is originally empty and will contain, after compilation of SQPpro, the following module descriptors: sqppro mod.$PLAT.mod for the sqppro mod module, which provides, in particular, the description of the public derived types discussed in section 2.1.

• The directory src contains the peculiar routines of the SQPpro solver and a Makefile to compile them.

Installation

The QP solver used by SQPpro is QPAL (version 0.6.1) [START_REF] Ch | QPAL -A solver of convex quadratic optimization problems, using an augmented Lagrangian approach -Version 0.6.1[END_REF]. The QPAL solver must therefore be installed somewhere in your hierarchy before you can use SQPpro. Once this has been completed, the installation of SQPpro can be done by following the stages given below. 2. The second stage deals with platform matters. To know the chosen compiler, linker and their options, the Makefile's of the SQPpro package include a file named make.$PLAT, located in sqppro directory . Here, $PLAT is the value of an environment variable defined by a Unix/Linux command similar to setenv PLAT mach.os.comp

The string "mach.os.comp" above is arbitrary; the proposed form allows you to identify the machine type "mach", its operating system "os", and the chosen compiler suite "comp"; examples might be setenv PLAT pc.linux.pgf90 setenv PLAT mac.osx.gcc

The file "make.a platform" in sqppro directory is an example of such a make.$PLAT file and, now that the environment variable PLAT has been defined, you may want to adapt it to your platform by first copying it cp make.a platform make.$PLAT and next adapting the following variables, which are the only ones used in the SQPpro Makefile's:

F03 = #

Usage

We start in section 2.1 by specifying the data structures of the SQPpro solver, the Fortran derived types used to define the data exchanged with the solver. In section 2.2, we describe the problem simulator that is expected by SQPpro, which is the part of the program that evaluates the value of the functions defining problem (P EI ) and their derivatives. The role and the arguments of the subroutines sqppro allocate, sqppro default options, and sqppro solve, which are the three entry points into the solver, are described in section 2.3. In section 2.3.4, we give the typical sequence of statements that must precede a call to the solver.

Data structures

The SQPpro solver is structured as a Fortran module, named sqppro mod, with its private/public derived type definitions, data, functions, and subroutines. The entry point to the solver is sqppro solve. The associated subroutine sqppro solve gathers its arguments in structures (having a given Fortran derived type), in order to make clearer the links between them and to make easier passing them from one procedure to the other. The public derived types used to define the arguments are described below.

Theses public derived types have allocatable components that are allocated by the subroutine sqppro allocate; see section 2.3.1. You will be able to use variables defined by these types only after having called that subroutine. Useless components are not allocated.

We remind the reader that the value of the component c of a variable v of a given derived type is given by v%c.

Data types

SQPpro can store the Jacobians of the inequality and equality constraints in dense or sparse matrices. This section describes the Fortran public derived types that have been defined to store these various data structures.

We start with the public derived type for storing sparse matrices.

type, public :: sqppro_sparse_type

RT n°0378
inria-00442314, version 1 -19 Dec 2009 sequence integer :: nnz integer, allocatable :: i(:), j(:) double precision, allocatable :: v(:) end type sqppro_sparse_type With the keyword sequence, the components are stored in the specified order (otherwise, no storage sequence is implied by the order of the component definitions). As a result, a structure with a type identical to sqppro sparse type (also with the keyword sequence) but with a different type name will be correctly identified with a structure of type sqppro sparse type.

Here is a description of the components.

• nnz: this integer specifies the number of nonzero elements of the matrix.

• i(:) and j(:): the integers i(k) and j(k), for k = 1, . . . , nnz, are the row and column indices of the kth nonzero element of the matrix. • v(:): the double precision value v(k), for k = 1, . . . , nnz, gives the value of the kth nonzero element of the matrix.

We now introduce the public derived type named sqppro hessian type, which describes the memory representation of the Hessian of the Lagrangian, knowing that this one can be a dense BFGS matrix, a direct ℓ-BFGS matrix, or an inverse ℓ-BFGS matrix.

type, public :: sqppro_hessian_type integer :: id double precision, allocatable :: dense(:,:) type(lbfgs_dir_hessian_type) :: lbfgs_dir type(lbfgs_inv_hessian_type) :: lbfgs_inv end type sqppro_hessian_type Description of the components.

• id: this integer component specifies the Hessian identificator, which describes the type of storage SQPpro has to provide for the Hessian of the Lagrangian. The following 3 values can be used, named by public parameters:

dense informs SQPpro that the Hessian of the Lagrangian must be stored in the component dense; lbfgs dir informs SQPpro that the Hessian of the Lagrangian is a direct ℓ-BFGS matrix that must be stored in the data structure lbfgs dir; lbfgs inv informs SQPpro that the Hessian of the Lagrangian is an inverse ℓ-BFGS matrix that must be stored in the data structure lbfgs inv.

• dense: this allocatable double precision array of dimension (n,n) is used to store the Hessian when id = dense.

• lbfgs dir: this memory structure of type lbfgs dir hessian type is used to store a direct ℓ-BFGS matrix, when id = lbfgs dir. The memory structure is defined in the module modulopt lbfgs mod.

• lbfgs inv: this memory structure of type lbfgs inv hessian type is used to store an inverse ℓ-BFGS matrix, when id = lbfgs inv. The memory structure is defined in the module modulopt lbfgs mod.

The next derived type is used to describe the memory representation of the inequality and equality constraint Jacobians, c ′ I (x) and c ′ E (x) respectively. These Jacobians can be dense or sparse.

type, public :: sqppro_constraint_type integer :: id double precision, allocatable :: dense(:,:) type(sqppro_sparse_type) :: sparse end type sqppro_constraint_type Description of the components.

• id: this integer component specifies the constraint Jacobian identificator. The following 2 values can be used, named by public parameters:

dense informs SQPpro that the jacobian is a dense matrix that must be stored in the component dense; sparse informs SQPpro that the jacobian is a sparse matrix that must be stored in the component sparse.

• dense: this allocatable double precision array of appropriate dimension is used to store the constraint Jacobian when id = dense.

• sparse: this memory structure of type sqppro sparse type is used to store a sparse constraint Jacobian when id = sparse.

Problem data

The public derived type sqppro data type must be used to define a structure whose aim is to give data on problem (P EI ) on entry in sqppro solve (section 2.3.3) and during the run at the generated iterates. Its allocatable parts are allocated by sqppro allocate (section 2.3.1).

type, public :: sqppro_data_type integer :: n, nb, mi, me double precision :: f double precision, pointer :: g(:) type(sqppro_hessian_type) :: h double precision, allocatable :: lb(:), ub(:) double precision, allocatable :: li(:), ui(:), ci(:) type(sqppro_constraint_type) :: ai double precision, allocatable :: ce(:) type(sqppro_constraint_type) :: ae end type sqppro_data_type Here are the components of this type.

• n, nb, mi, me: these integers give respectively the number n of variables, the number of bounded variables (those with l i > -inf and/or u i < inf, see the description of the sqppro options type type in section 2.1.3 for the meaning of inf), the number m I of nonlinear inequality constraints (those modelled by c I ), and the number m E of equality constraints (those modelled by c E ).

• f: this double precision variable aims at receiving the value f (x) ∈ R of the objective f at a given primal iterate x.

• g(:): this variable points to a double precision array used to store the gradient g(x) = ∇f (x) ∈ R n of the objective of (P EI ) at a given primal iterate x.

• h: this variable of sqppro hessian type type is aimed at receiving the approximation of the Hessian of the Lagrangian at a given primal-dual iterate (x, λ).

• lb(:), ub(:): these allocatable double precision arrays are used to store the vectors l B and u B ∈ R n giving respectively the lower and upper bounds on the variables x.

• li(:), ui(:), ci(:), ai: these double precision arrays and sqppro constraint type variable are related to the nonlinear inequality constraints. The lower and upper bounds l I ∈ R mI and u I ∈ R mI are stored in li and ui, respectively. The other variables are aimed at receiving the value at a given primal iterate x of the nonlinear inequality constraint function c I (in ci) and of the Jacobian c ′ I (x) of c I (in ai). More precisely, assuming that I = {1, . . . , m I }, for i ∈ I and j ∈ B, there hold

ci(i) = c i (x), li(i) = l n+i , ui(i) = u n+i ,
while a dense inequality constraint Jacobian is stored in

ai%dense(i,j) = ∂c i (x) ∂x j
and, if (c ′ I (x)) ij is the kth element of a sparse inequality constraint Jacobian, it is stored by

ai%sparse%i(k) = i, ai%sparse%j(k) = j, ai%sparse%v(k) = ∂c i (x) ∂x j .
• ce(:), ae: these double precision array and sqppro constraint type variable are aimed at receiving the value at a given primal iterate x of the nonlinear equality constraint function c E (in ce) and of the Jacobian c ′ E (x) of c E (in ae). More precisely, assuming that E = {1, . . . , m E }, for i ∈ E and j ∈ B, there hold ce(i) = c i (x), while a dense equality constraint Jacobian is stored in

ae%dense(i,j) = ∂c i (x) ∂x j and, if (c ′ E (x)) ij is the kth element of a sparse equality constraint Jacobian, it is stored by ae%sparse%i(k) = i, ae%sparse%j(k) = j, ae%sparse%v(k) = ∂c i (x) ∂x j .
The dimensions n, mi, and me are set by sqppro allocate, the constant components (independent of the current iterates x) lb, ub, li, and ui are set by the user after having called sqppro allocate (see section 2.3.4). The other components are filled in by the simulator (see section 2.2).

As Fortran-2003 pointers, g, ai, and ae are just other names for variables used to describe the corresponding data of the osculating quadratic problem (1.3); these variables are inherited from variables allocated by the QP solver QPAL.

Solver options

The public derived type sqppro options type is used to describe the options of the SQPpro solver, i.e., those parameters that can be used to tune the behavior of the solver. A variable of that type can receive the default options of the solver by calling sqppro default options (section 2. The components of this type are gathered above by Fortran type and nature. For making their localization faster, they are presented below in alphabetic order. Valid and default values are indicated.

• dcmin: positive double precision variable that is used to detect active bounds on c I (x). To this respect, there must also hold

∀i ∈ I : u i -l i > 2 (dcmin).
This value also intervenes in the complementarity conditions.

Valid values: > 0.

Default value: 10 -10 .

• dxmin: positive double precision variable that specifies the precision to which the primal variables must be determined. If sqppro solve needs to make a step smaller than dxmin in the infinity-norm to progress to optimality, it will stop. To this respect, a too small value for dxmin will force the solver to work for nothing at the very end when rounding errors prevent making any progress.

The value of dxmin is also used to detect active bounds on x. To this respect, there must also hold ∀i ∈ B :

u i -l i > 2 (dxmin).
This value also intervenes in the complementarity conditions.

Valid values: > 0.

Default value: 10 -10 .

• fout: integer variable that is taken as the channel number for the outputs, i.e., these are written by: write (fout,...) ... Default value: 10 -6 .

Valid
• max iter: integer variable specifying the maximal number of iterations allowed.

Valid values: > 0.

Default value: ∞.

• plevel: integer variable that specifies the printing level of the solver, i.e., the amount of information that is written on channel options%fout. The following values are meaningful: = 0: nothing is printed; the only manner to be informed of the behavior of sqppro solve is to look at the the argument info of the solver (see section 2.1.4 for the description of its components); 1: error and warning messages (default); 2: initial setting and final status; 3: one line per iteration; 4: details on the iterations; 5: details on the step computation are written in a file named sqppro-qp.txt in the working directory. Valid values: 0. Default value: 1.

• qp feas decr factor: double precision variable giving the desired decrease factor for the constraint norm in the QP solver QPAL. A small value looks better but it forces QPAL to take a large augmented Lagrangian parameter, inducing ill-conditioning. For a small easy problem, qp feas decr factor can be chosen rather small. For a large scale ill-conditioned problem, choose qp feas decr factor closer to 1.

Valid values: ]0, 1[. Default value: 10 -1 .

• qp max alit: integer variable specifying the maximal number of augmented Lagrangian iterations in any QPAL run.

Valid values: > 0.

Default value: 50.

• qp max cgit: integer variable specifying the maximal number of conjugate gradient iterations in any QPAL run.

Valid values: > 0.

Default value: 10000.

• qp max hvpd: integer variable specifying the maximal number of Hessian-vector products in any QPAL run.

Valid values: > 0.

Default value: 10000.

• qp max avpd: integer variable specifying the maximal number of Jacobian-vector products in any QPAL run.

Valid values: > 0.

Default value: 10000.

• qp norm: this string, made of at most 3 characters, specifies the type of vector norm • QP that must be used to check optimality of the QP (1.3):

-'2' or 'euc' for the ℓ 2 or Euclidean norm v 2 := ( i v 2 i ) 1/2 , -'inf' for the infinity or sup norm v ∞ := max i |v i |. Of course, for any vector v, v ∞ v 2 , so that for identical tolerances, the QP solver stops more rapidly with the sup norm than with the Euclidean norm. Valid values: '2', 'euc', 'inf'.

Default value: 'inf'.

• qp forcing factor: when qp precision id is set to variable, this double precision component is used to control the precision on the direction computed by the QP solver. See section 2.4.1 for more information.

Valid values: (0, 1). Default value: 0.5.

• qp precision id: this integer component specifies the QP precision identificator, which is used to indicate the method that must be used to control the precision to which the QP's (1.3) must be solved at each iteration. The following 2 values can be used, named by public parameters:

fixed requires from SQPpro that it imposes to the QP solver to solve the QP's with a precision that is identical at each iteration and that is specified by the qp tol glan and qp tol feas components; variable requires from SQPpro that it imposes to the QP solver to solve the QP's with a precision that depends on the presision reached on the nonlinear problem (1.1) at the current iteration, using the parameter qp forcing factor and ensuring nevertheless that the computed direction be a descent direction of the merit function; this strategy is in the spirit of the truncated Newton method . See section 2.4.1 for more information. Valid values: fixed, variable.

Default value: fixed.

• qp tol glan, qp tol feas: when qp precision id is set to fixed, these double precision components are used to specify the tolerances on the KKT conditions of the QP (1.3), using the norm • QP : qp tol glan refers to the norm of the gradient of the QP Lagrangian and qp tol feas refers to the norm of the QP constraints.

Valid values: > 0. Default value: 10 -6 .

Solver diagnostics

The public derived type sqppro info type contains the information on the problem (P EI ) returned by the solver SQPpro.

type, public :: sqppro_info_type integer :: nb, iter, nsim, info double precision :: kkt_glan, kkt_feas, kkt_cmpl end type sqppro_info_type Here are the components of this type.

• nb: this integer variable contains the number of variables x i with a lower and/or an upper bound (i.e., the number of i ∈ B with either l i or u i finite).

• iter: this integer variable is the number of iterations performed by the solver.

• nsim: this integer variable is the number of times the simulator has been called.

• info: this integer variable is the return value of the solver, which specifies the reason why it stopped. Here are the possible values: = 0: the stopping criterion is verified. = 1: failure in the initialization; = 2: an argument is wrong; = 5: maximal number of iterations has been reached; = 6: maximal number of simulations has been reached; = 7: stop required by the simulator; = 9: too many stepsize trials in the linesearch; = 10: the QP solver has computed a null step, although x is not optimal (strange); = 20: maximal number of iterations has been reached in the QP solver; = 21: maximal number of matrix-vector products has been reached in the QP solver; = 22: nonconvex quadratic problem (1.3); = 23: linesearch failure in the QP solver; = 24: an infeasible QP has been encountered; = 25: if feasible, the quadratic problem (1.3) is likely to be unbounded; = 99: abnormal failure, call your guru.

More information can usually be obtained on a possible failure of the optimization by running the solver with options%plevel > 0.

• kkt glan: double precision variable giving the ℓ ∞ -norm of the gradient of the Lagrangian at the output primal-dual variable (x, λ):

info%kkt glan(x, λ) := ∇ x ℓ(x, λ) ∞ . (2.1)
This value can be viewed as an optimality measure.

• kkt feas: double precision variable giving the infinity norm of the constraint violation at the final primal-dual variable (x, λ):

info%kkk feas(x) := max(0, l -c B∪I (x), c B∪I (x) -u) c E (x) ∞ .
(2.2)

The value of kkt feas can be viewed as a feasibility measure.

• kkt cmpl: double precision variable measuring the complementarity. It is defined as the minimum of two measures, specifically by

info%kkk cmpl(x, λ) := min(c1, c2) ∞ , (2.3)
where the components of the vectors c1 and c2 are defined for i ∈ B by (a similar definition is used for i ∈ I):

c1(i) := λ - i if |l i -x i | > options%dxmin λ + i if |u i -x i | > options%dxmin and c2(i) := |l i -x i |λ - i + |u i -x i |λ + i .
Hence, info%kkk cmpl takes, for each component, the best of two complementarity measures. Expression c1 is based on the fact that if the ith lower [resp. upper] bound is inactive, the associated multiplier should be nonnegative [resp. nonpositive], hence λ - i [resp. λ + i ] should be zero. Expression c2 is based on the fact that λ - i (l ix i ) and λ + i (x iu i ) should be zero, see (1.2-c).

User data

The public derived type sqppro user type is used to allow the user to pass information to the simulator through sqppro solve. This structure is not used by the solver; it is not manadged either, meaning that its allocatable variables must be allocated by the user of the solver. type, public :: sqppro_user_type integer, allocatable :: izs(:) real, allocatable :: rzs(:) double precision, allocatable :: dzs(:) end type sqppro_user_type

Here are the components of this type.

• izs: this integer array is dedicated to pass integer values to the simulator.

• rzs: this real array is dedicated to pass real values to the simulator.

• dzs: this double precision array is dedicated to pass double precision values to the simulator.

Simulator

The simulator is the part of the program that evaluates the value of the functions defining problem (P EI ) and their derivatives. SQPpro get information on the problem to solve through direct communication: the simulator receives a message from sqppro solve, which tells what has to be computed, using the flag indic; then the simulator fills in parts of the structure data and uses indic to tell sqppro solve whether the required computation has been reallized.

Here is the subroutine definition statement that is assumed by SQPpro.

subroutine simul (indic, x, data, user) indic: integer variable organizing the communication between the solver sqppro solve and the simulator simul.

• On entry, indic is used by sqppro solve to tell the simulator simul what it has to do. = 1: The simulator can do anything except changing the value of x (doing nothing is also fine). Typically it prints some information on the screen, in a file, or on a plotter. The solver sqppro solve calls the simulator with this value of indic at each iteration, so that the simulator can also count the iterations. = 4: The simulator is asked to compute data%f = f (x), data%ci = c I (x), and data%ce = c E (x) at a given point x, as well as the gradient data%g = ∇f (x) ∈ R n , and the Jacobian matrices data%ai = c ′ I (x) and data%ae = c ′ E (x) at a given point x.

• On return, it contains a message from the simulator to sqppro solve. 0: normal call; the required computation has been done. = -1: by this value, the simulator tells the solver that it is impossible or undesirable to do the calculation at the point x given by the solver. In that case, sqppro solve backtracks along the search direction, until the computation can be done.

RT n°0378

inria-00442314, version 1 -19 Dec 2009

This feature can be used when implicit constraints are present, i.e., strict inequality constraints or inequalities that are known to be inactive at the solution. By no way this feature can handle inequality constraints that are active (satisfied with equality) at the solution. = -2: the simulator asks sqppro solve to stop, for example because some events that the solver cannot understand (not in the field of optimization) has occurred.

x (I): double precision array of dimension n. It is the vector of primal variables x at which the functions defining (P EI ) have to be evaluated. The vector x cannot be modified by the simulator.

user (I): this is the same variable as the one with the same name, given as argument of sqppro solve. The solver sqppro solve does not touch it and transmits it to the simulator as an argument of simul. See section 2.1.5 for a description of its components.

Running the solver

The SQPpro solver makes available three subroutines: sqppro allocate, sqppro default options, and sqppro solve. The subroutine sqppro allocate must be used to allocate variables of a data structure (section 2.3.1). The subroutine sqppro default options can be used to get the default options of the solver, before tuning these to a particular run (section 2.3.2). The subroutine sqppro solve is used to solve a particular instance of problem (P EI ) (section 2.3.3) In the description of the subroutines, an argument flagged with (I) means that it is an input or intent(in) variable, which has to be initialized before calling the subroutine; an argument flagged with (O) means that it is an output or intent(out) variable, which has only a meaning on return from the subroutine; and an argument flagged with (IO) is an input-output or intent(inout) argument, which has to be initialized and has a meaning on return from the subroutine.

Memory allocation with sqppro allocate

The subroutine sqppro allocate must be called before calling sqppro solve. Its role is to allocate memory to the data structure of the dummy argument data, which is aimed at containing data on problem (P EI ). It is only after having called sqppro allocate that it will be possible to fill in the variable data. This allocation depends on the type of approximation chosen for the Hessian of the Lagrangian (variables h type and h mys); since this one can be specified by a specification file, this file is read and scrutinized by sqppro allocate. The values of h type and h mys in that file prevail on the values given on entry in sqppro allocate. subroutine sqppro allocate (n, nb, mi, me, & h type, h mys, ai id, ai nnz, ae id, ae nnz, & fout, plevel, flag, data) n, nb, mi, me (I): positive integer variables specifying the dimensions of the problem (P EI ): n = n, mi = m I , me = m E , and nb is the number of primal variables with a lower or an upper bound (hence nb ∈ [0, n]). Actually, the latter must only be vaguely defined: if there is no bound on x, set nb = 0, otherwise give nb an arbitrary positive (> 0) value. Indeed, sqppro allocate only trusts the sign of nb to decide whether memory must be allocated for the bounds on x, i.e., for the variables data%lb(1:n) and data%ub(1:n).

h type (I): integer variable specifying the Hessian type. In the current version, SQPpro can only use approximations of the Hessian of the Lagrangian, either using the BFGS formula (for small problems, say less than a few hundred variables) or the ℓ-BFGS formula (for larger problems). The type of approximation is decided by sqppro allocate and stored in a variable in the sqppro mod module. The following values are possible:

• bfgs: a BFGS approximation of the Hessian of the Lagrangian is generated by the solver,

• lbfgs: an ℓ-BFGS approximation of the Hessian of the Lagrangian is generated by the solver; the inverse formula is used if there is no constraint, in which case there is no need to solve an osculating QP (faster); the direct formula is used if there are constraints.

The value of h type given in the specification file prevails on the one given in argument to sqppro allocate.

h mys (I): positive integer variable. It is only used in case an ℓ-BFGS Hessian approximation is declared with h type, to specify the number of pairs (y k , s k ) that are used to form the Hessian approximation.

ai id (I): integer variable. It identifies the type of memory space used to store the inequality constraint Jacobian c ′ I (x) at a given point x. See the description of the id component of the type sqppro constraint type in section 2.1.1 for the possible values of this variable, which can be dense or sparse. ai nnz (I): integer variable. It gives the number of nonzero elements in the inequality constraint Jacobians c ′ I (•) in case this one is stored in a sparse structure (ai id has been set to sparse); it is meaningless otherwise. ae id (I): integer variable. It identifies the type of memory space used to store the equality constraint Jacobian c ′ E (x) at a given point x. See the description of the id component of the type sqppro constraint type in section 2.1.1 for the possible values of this variable, which can be dense or sparse. ae nnz (I): integer variable. It gives the number of nonzero elements in the equality constraint Jacobians c ′ E (•) in case this one is stored in a sparse structure (ae id has been set to sparse); it is meaningless otherwise. fout (I): integer variable. This is the channel number for the written outputs in sqppro allocate.

plevel (I): integer variable. It specifies the printing level of sqppro allocate. The following values are meaningful: 0: silent mode; > 0: error and warning messages are printed on channel fout. flag (O): integer variable. It provides information on the allocation process. Possible values are: = 0: allocation done; = 1: allocation was already done in a previous call to sqppro allocate; = 2: QPAL allocation failed; = 3: SQPpro allocation failed; = 4: some of the allocations were already done; allocation is probably correct is the previous allocated variables had the appropriate dimensions.

data (O): variable of type sqppro data type (see section 2.1.2). The useful allocatable components of the variable are allocated by sqppro allocate.

Setting default options with sqppro default options

The subroutine sqppro default options can be called to set the default options in a structure of sqppro options type type, named options below. This call is normally made before setting RT n°0378

inria-00442314, version 1 -19 Dec 2009

the various component of options to values that are appropriate to the optimization problem to solve. It allows the user not to have to set all the componentws in options, when the default ones are appropriate. The options determined by sqppro default options and possibly modified after having called that subroutine are overwritten by sqppro solve with the options given in the specification file named sqppro.spc in the working directory. An example of specification file is provided in sqppro directory /doc/sqppro.spc with enough comments to be self-explanatory.

subroutine sqppro default options (options) options (O): variable of type sqppro options type (see section 2.1.3), which contains the default options.

Solving the problem with sqppro solve

The solver of the SQPpro package is sqppro solve. The list of its arguments is rather short, because these have been gathered in the structures data, info, options, and user. Here is the subroutine definition statement.

subroutine sqppro solve (simul, x, lm, data, info, options, user) simul: generic name of the user-supplied simulator: see section 2.2 for more details. This name can be modified, but must be declared external in the subroutine calling sqppro solve.

x (IO): double precision array of dimension n. It is the vector of variables x = (x 1 , . . . , x n ) to optimize.

• On entry, it is an initial guess of the solution to (P EI ). It is taken as starting point by sqppro solve. This point need not be feasible.

• On return, when info%info = 0 (see section 2.1.4), it is the optimal solution x found by sqppro solve. between the multiplier λ u B∪I associated with the upper bound and the multiplier λ l B∪I associated with the lower bound. Since l i < u i , either λ u i or λ l i vanishes, or both. Therefore, one can recover λ u B∪I and λ l B∪I by

λ u B∪I = λ + B∪I and λ l B∪I = λ - B∪I .
If there is no constraint (no bounds on x, m I = 0, and m E = 0) and lm is an allocated array, it may not be allocated (in gfortran); sqppro solve will not use it.

• On entry, lm is an initial guess of the dual solution to (P EI ). This vector can just be initialized to zero, when one has no idea of the dual solution (this is often the case).

• On return, when info%info = 0 (see section 2.1.4), lm is the vector of optimal multipliers λ found by sqppro solve.

data (IO): this is a variable of Fortran-2003 type sqppro data type, a derived public type that is defined in the module sqppro mod. It must be used to give data on problem (P EI ) on entry in sqppro solve and during the run at the generated iterates. See section 2.1.2 for a description of its components.

info (O): this is a variable of Fortran-2003 type sqppro info type, a derived public type that is defined in the module sqppro mod. The components of info contain information on problem (P EI ) and on the course of the run. See section 2.1.4 for a description of its components.

options (I): this is a variable of Fortran-2003 type sqppro options type, a derived public type that is defined in the module sqppro mod. The components of options are used to tune the behavior of the solver, by giving them a particular value before calling sqppro solve. See section 2.1.3 for a description of its components.

user (I): this is a variable of Fortran-2003 type sqppro user type, a derived public type that is defined in the module sqppro mod. The components of user are neither used nor modified by sqppro solve. They are considered as user variables and are transmitted to the simulator. See section 2.1.5 for a description of its components.

Calling sequence

We summarize below the structure of a program that uses sqppro solve to solve a nonlinear optimization problem. We assume for simplicity that all the instructions are in the same program unit.

1. Specification of the use of the SQPpro module sqppro mod: The variable indic should be 0 on return from this simulation.

7. Set in options the options of the solver that should not have the default value given by sqppro allocate:

call sqppro_default_options (options) options%plevel = 5 ...

The options that have been set in the specification file sqppro.spc in the working directory (if any) will prevail on those set here.

8. The solver sqppro solve can now be called:

call sqppro_solve (simul, x, lm, data, info, options, user)

See section 2.3.3 for the details.

Fine tunings

Setting the precision of the QP solver

The QP solver QPAL [START_REF] Ch | QPAL -A solver of convex quadratic optimization problems, using an augmented Lagrangian approach -Version 0.6.1[END_REF] used by SQPpro at each iteration implements an iterative process that cannot solve the QP's (1.3) with an arbitrary precision (because of rounding errors). How to specify the precision to which the QP's must be solved is a delicate task, which is monitored by various options that we now discuss (see section 2.1.3 for the list of the possible options). A fine tuning of these options is crucial for getting the best of the SQPpro solver on difficult problems. There are actually two ways of controlling the precision of the QP solver; they are selected by the QP precision identificator option qp_precision_id Either qp precision id = fixed (a parameter provided by the sqppro mod module), in which case the QP's are solved with a fixed specified precision at each SQP iteration, or qp precision id = variable (another parameter provided by the sqppro mod module), in which case the QP's are solved with a precision that depends on the SQP iteration. Note that in both cases, SQPpro may require a possibly more important precision for the QP solution than the one specified by the options described here, in order to ensure that the computed direction is a descent direction of the merit function; when the option plevel is 4, this situation is indicated in the output by the phrase QP solve (with more stringent accuracy) if such a more precise direction cannot be found by the QP solver, SQPpro stops mentioning that the QP solver failed. We now discuss the two possibilities specifiable by the option qp precision id.

Using fixed precision (qp precision id = fixed) is probably adequate for small problems or problems for which a rather crude solution is searched. In this case, the following two options are used for controlling the QP precision:

• qp tol glan specifies the absolute precision in the norm of the gradient of the QP Lagrangian (the used norm is specified by the option qp norm);

• qp tol feas; specifies the absolute precision in the norm of the QP feasibility (the used norm is specified by the option qp norm).

Using variable precision (qp precision id = variable) is often more appropriate for largescale problems, since this option usually yields a faster run (because the QP's are solved inexactly when the iterates are far from a solution) and makes it possible to get the best precision on the solution of the nonlinear problem (1.1). In the variable precision case, the following two options are used for controlling the QP precision:

• qp forcing factor must be set to a number in the open interval (0, 1); the QP solution is more precise when that number is closer to zero, but the precision is set relatively to the one obtained on the nonlinear problem (1.1) at the current iteration, so that the QP solution is required to be more precise when the iterate (x k , λ k ) approaches the primal-dual solution to the nonlinear problem;

• qp tol glan specifies the absolute precision in the norm of the gradient of the QP Lagrangian (the used norm is specified by the option qp norm); this value is necessary with the current version of the QPAL solver, which uses an augmented Lagrangian (AL) approach and must minimize completely (i.e., up to the precision given by qp tol glan) the QP Lagrangian at each AL iteration.

The solution offered in SQPpro 0.5 is not completely satisfactory, however, since the best way of controlling the precision of the solution computed by QPAL has not been completely clarified. In particular, it is still necessary to specify with the option qp tol glan the precision to which the AL must be minimized at each QPAL iteration. A too small value may lead to failure because the AL cannot be minimized at the required precision and a too large value may lead to the impossibility to satisfy the QP constraints.

Current limitations and perspectives

We list below the limitations of the software SQPpro we are aware of. The list is not comprehensive.

• The solver cannot deal with incompatible linearized constraints in the osculating tangent problem (1.3). This is intended to be fixed by shifting. The use of the Byrd-Omojokun trust region globalization technique also gives a solution to this difficulty. • The solver can be used several times in the same program, provided the dimensions of the problems to solve are identical. • Remedies to the Maratos effect have not been implemented yet.

• A true truncated Newton algorithm must still be implemented. This would require that the QPAL solver could provide a solution with a prescribed precision with respect to the Lagrangian gradient norm and to feasibility.

RT n°0378

inria-00442314, version 1 -19 Dec 2009

The following features are intended to be implemented in a near future. The list is not comprehensive.

• Updated Cholesky factorizations for solving linear systems (presently a conjugate gradient solver is used).

1 1

 11 Scope of the program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.2 Detecting optimality . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.3 Brief description of the method . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.4 The package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.4.1 Description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.4.2 Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Data structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.1.1 Data types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.1.2 Problem data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.1.3 Solver options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.1.4 Solver diagnostics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.1.5 User data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.2 Simulator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.3 Running the solver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 2.3.1 Memory allocation with sqppro allocate . . . . . . . . . . . . . . . . 16 2.3.2 Setting default options with sqppro default options . . . . . . . . . 17 2.3.3 Solving the problem with sqppro solve . . . . . . . . . . . . . . . . . 18 2.3.4 Calling sequence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.4 Fine tunings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.4.1 Setting the precision of the QP solver . . . . . . . . . . . . . . . . .

  lm (IO): double precision array of dimension n + m I + m E . It is the dual variable or KKT multiplier associated with the constraints of (P EI ). The first n components are associated with the bounds on x; the next m I components are associated with the inequality constraints l I c I (x) u I ; and the last m E components are associated with the equality constraints c E (x) = 0. The multiplier λ B∪I associated with the bound constraints is actually the difference λ B∪I := λ u B∪Iλ l B∪I

  3.2).

	type, public :: sqppro options type
	integer	:: fout, plevel
	integer	:: max iter
	integer	:: qp max alit, qp max cgit, qp max hvpd, qp max avpd
	character(len=3) :: qp norm
	integer	:: qp precision id
	double precision :: qp tol glan, qp tol feas
	double precision :: qp forcing factor
	double precision :: qp feas decr factor
	double precision :: kkt tol(3)
	double precision :: inf, dxmin, dcmin
	end type sqppro options type

  inf: double precision variable specifying what is the infinite value for the bounds l i and u i . More precisely, if l i -inf (resp. u i inf), the ith lower (resp. upper) bound is assumed to be absent.

	Valid values: > 0.	Default value: huge(1.d0).
	• kkt tol: double precision array of dimension 3, which provides the tolerances on the KKT
	conditions (1.2) for detecting a solution (more precisely a stationary point). An iterate (x, λ) is
	indeed considered to be a satisfactory approximate primal-dual solution to problem (P EI ) if
	info%kkt glan(x, λ)	kkt tol(1)
	info%kkk feas(x)	kkt tol(2)
	info%kkk cmpl(x, λ)	kkt tol(3),
	where info%kkt glan(x, λ), info%kkk feas(x), and info%kkk cmpl(x, λ) have been defined by
	(2.1), (2.2), and (2.
	inria-00442314, version 1 -19 Dec 2009
	RT n°0378

values: > 0. Default value: 6 (screen). • 3), respectively. Hence kkt tol(1) controls the proper optimality (1.2)-(a), kkt tol(2) controls the feasibility (1.2)-(b), and kkt tol(3) controls the complementarity (1.2)-(c). Valid values: > 0.

  If some of the public parameters of sqppro mod, like bfgs or lbfgs, are in conflict with your own variables, you can rename them. For example to rename bfgs into sqppro bfgs and lbfgs into sqppro lbfgs, write instead Declare the variables n, nb, mi, me, h type, h mys, fout, plevel, flag, and data, and set them (except data, which has non-allocated components). Then allocate the useful allocatable components of data by call sqppro_allocate (n,nb,mi,me,h_type,h_mys,fout,plevel,flag,data)These will not be modified by sqppro solve. Note that data%n, data%nb, data%mi, and data%me are set in sqppro allocate with the corresponding values given to its arguments. 4. Declare the variable user (this is an argument of the solver sqppro solve and the simulator, see sections 2.1.5, 2.2, and 2.3.3). Set it if this is appropriate, i.e., if values must be transmitted to the simulator through the SQPpro solver.5. Declare and initialize the primal variable x = x ∈ R n and the constraint multiplier lm = λ ∈ R n+mI +mE .6. It is asked to call the simulator simul (section 2.2), before calling the solver sqppro solve, in order to fill in the variable components of data:

		indic = 4
		call simul (indic, x, data, user)
	inria-00442314, version 1 -19 Dec 2009	use sqppro_mod
		use sqppro_mod, sqppro_bfgs => bfgs, &
		sqppro_lbfgs => lbfgs
	2. The parameter flag should be nonzero on return from sqppro allocate. See section 2.3.1
	for more information.
	3. You can now fill in the constant array components of the variable data (see section 2.1.2 for
	a descritption of its components), namely
		data%lb = ...
		data%ub = ...
		data%li = ...
		data%ui = ...
	RT n°0378

  • Reverse or socket communication. • Globalization by trust regions. • Possibility to use second derivatives. • Parallelisation of the loops with OpenMP directives [9]. simul, see subroutine simulator, see also subroutine simul, 10, 14, 15 solution, 4 sparse, see matrix sparse, see public parameter specification file, 5, 16, 18 sqppro-qp.txt, see file sqppro.spc, see specification file sqppro allocate, see public subroutine sqppro constraint type, see public derived type sqppro data type, see public derived type sqppro default options, see public subroutine sqppro directory , see directory sqppro hessian type, see public derived type RT n°0378 inria-00442314, version 1 -19 Dec 2009 sqppro info type, see public derived type sqppro mod, see module sqppro options type, see public derived type sqppro solve, see public subroutine sqppro sparse type, see public derived type sqppro user type, see public derived type src, see directory

	qpal directory , 7	qp max cgit, 12 stationary point, 4
	sqppro directory , 6, 18	qp max hvpd, 12 subroutine
	src, 6	qp norm, 13, 21 simul, 15-16
	doc, see directory	qp precision id, 13, 20
		qp tol feas, 13, 21 truncated Newton method, 13
	example, see directory	qp tol glan, 13, 21, 21
	feasibility, 4, 12	osculating quadratic problem, 4 variable, see public parameter
	feasible point, 4, 18 set, 4 file sqppro-qp.txt, 12 sqppro.spc, see specification file fixed, see public parameter Fortran 2003, 4	primal-dual algorithm, 4 problem osculating quadratic -, 4 (PEI ), 3 public derived type sqppro constraint type, 9 sqppro data type, 9-10 sqppro hessian type, 8-9
	gfortran, 4	sqppro info type, 13-14 sqppro options type, 11-13
	Hessian identificator, 8 Hessian type, 16	sqppro sparse type, 7-8 sqppro user type, 15 public parameter bfgs, 17
	KKT conditions tolerances, 12, 13	dense, 8, 9 fixed, 13 lbfgs, 17
	lbfgs, see public parameter lbfgs dir, see public parameter lbfgs inv, see public parameter Libopt, 6 libopt, see directory	lbfgs dir, 8 lbfgs inv, 8 sparse, 9 variable, 13 public subroutine sqppro default options, 17-18, 20
	matrix	sqppro allocate, 16-17, 19
	dense, 4	sqppro solve, 18-19, 20
	sparse, 4 mod, see directory module sqppro mod, 7, 19 multiplier, 4, 19	QP qpal, see directory fixed precision, 13, 21 precision identificator, 13, 20 variable precision, 13, 21
	norm, see • QP	qpal directory , see directory
	objective, 3	sequence, 8
	optimality (proper), 4, 12
	optimality conditions, 4
	option
	dcmin, 11
	dxmin, 11
	fout, 11
	inf, 12
	kkt tol, 12
	max iter, 12
	plevel, 12
	qp feas decr factor, 12
	qp forcing factor, 13, 21
	qp max alit, 12
	qp max avpd, 13

complementarity, 4, 12 constraint bound, 3 equality, 3 implicit, 16 inequality, 3 constraint Jacobian identificator, 9 COPYRIGHT, 5 CUTEr, 5 cuter, see directory dense, see matrix dense, see public parameter direct communication, 15 directory bin, 5 cuter, 5 doc, 5 example, 5 libopt, 6 mod, 6 qpal, 7 INRIA

http://www.inria.fr ISSN 0249-0803


Keywords: Marriage contracts, Arad county, matrimonial relationships, dissolution of marriage, dowry, children status, household, everyday life, Habsburg Empire

The paper "Some aspects regarding matrimonial relations in the city of Arad in the XVIIIth Century" was

Their need has arisen for at least two reasons. On one hand, they could more easily resolve any disputes arising in the case of marriage disruption, on the other hand, the absolutist state, in a spirit of fairness and care towards the wife and children had all the interest that if a divorce occurred, the law would say its word in matters concerning property and inheritance. Given that there is not a requirement of concluding a marriage by means of a civil contract, it is assumed that the parties themselves had their own interest in the conclusion of such contracts. After all, this type of document sought only to ensure the strengthening of the espousal, protecting children from another marriage and preserving the rights of women in case the death of the husband would occur.

Genesis process of these contracts was directly related to changes in Europe. Several mutations have occurred and the most important relate to two processes: the alteration of beliefs and religious practices provoked by the Reformation and the Counter-Reformation and that of secularization, propelled by the rebirth of culture and knowledge systems especially during the Enlightenment. If religion and material claims of the Church played such an important role in regulating family life in Europe, it was inevitable that, when they were modified, it would change the rules of family life. The diminution of church influence, translation of family issues under laic courts authority, emphasis on secular ideologies and theories was a process that has been one of the Enlightenment's traits during the XVIIIth century (Goody, 2003, pp. 24, 87-88).

All these were visible in the city of Arad in the XVIIIth century. The practice of marriage contracts was brought obviously by the newcomers in these places after the removal of Ottoman occupation. Practically, their descendants have resorted to such acts as the oldest existing marriage contracts at DJAN Arad (National Archive of Arad County) come back in time since the reign of Maria Theresa. Those who have recourse to such legal rules were mainly of Catholic religion and German ethnicity, their social and professional status being above average. In a random selection, the criterion of formal document quality prevailed -this meaning election of readable and well kept contracts -I was surprised however to see that in at least one case of those studied, the regulation of marriage relationships was made also for the Romanian ethnics. Even if it is an act of wealth sharing after a divorce, the document suggests that at the time of marriage the two spouses have signed a contract, which must be respected.

The number of marriage and divorce papers at DJAN Arad for the XVIIIth century amounts to several dozens of such documents totalling over 200 pages. For the present study, I have chosen six marriage contracts, three of the 1762-1763 period and three during 1791-1795 and two divorce inventories at the end of the century XVIIIth century.

For many people in the course of familial aggregation, the marriage was a necessary step for regulation legal relationships before reaching the altar. The same thing happened for the few inhabitants of Arad in the XVIIIth century who have been the subjects of the documents below.

In order to use the easy reference of these documents, I chose a conventional numbering according to their chronology Divorce II -Mathias Albrecht and Ursula Tuskanitzin, dated January 8, 1799 (DJAN Arad, fond PmA, dosar 7/1792, filele 11-13).

The six contracts of marriage fall into the same types that, although coming from different periods, the shape and structure is similar. The introduction and conclusion formulae are nearly identical, small differences concerning the form and not substance. Although they are secular acts, even from the introduction there are religious references as the top formula is "on behalf of the Holy Trinity". This proves that although secularization has made important progress in the XVIIIth century, the religious sense is found in the stylistic formulas of the contracts just because of its striking importance in people's life. The final part is a standard legal formula which means the legalization of the designed  I wish to notice that there is no mistake in the contract signed in 1791 and that he is classified in DJAN Arad in a file for the year 1792. In addition to those who made the classification of an explanation is that in 1792 the contract was completed with a new clause and therefore was considered to be fully prepared for that year. In fact the whole file are two marriage contracts from other years, 1793, respectively 1795, and two inventories of divorce in 1798 and 1799. contract always in duplicate to be signed by contractors and those present as witnesses, godparents, lawyers and notary.

The number of contract items is different, being directly linked to the complexity of relationships to be regulated, by the infants' number or other issues regarding inheritance or obligations of the parties. Thus, there are contracts with three terms as there are others with six or seven terms.

The style of these acts is largely tributary to standard legal expressions. Whatever was the love's purpose, over which some historians have insisted on the XVIIIth century, money played an important role in marriage, particularly among aristocracy (Hufton, 1995, p. 252). However, a certain vocabulary that makes direct reference to feelings is present in the texts of these contracts. Phrases such as "beloved bridegroom of Mrs. bride" (contract III), "Mr. groom is married to his much beloved lady bride", "bride gets married with her much beloved groom" (contract II) "beloved bride", "the two people promise their love" (contract IV), "beloved husband" (contract V), are found in almost all documents. From the timid "lady bride" to the superlative nuances such as "much beloved lady bride", differences probably are more of a juridical courtesy of notaries in face of such events than a reflection of reality. Future role of the spouses was only to be present in front of the official, the rest was the notary's work, who, through its used wording imprinted style in addition to the legal trait of the acts.

Yet all this epithets must have had a correspondence in reality. The explanation is the situation of remarriage (all six women from the contracts listed above were widows, being at a second marriage), as a much greater freedom of choice of the partner occurred then at the first marriage. Through the allocated dowry, the parents had the most important word when it came to choosing the future husband for their daughter. In these conditions, the dowry actually limited free choice and was a constraining factor for women who had to comply with the wishes of the family. The state of widowhood ensured at least one emotional independence for women, and choosing a future partner for life was no longer encumbered by factors other than their own will (Goody, 2003, p. 117).

Besides the officious tone, the stylistic register is complemented by epithets used with respect to future spouses, as besides simple formulations "Mr. is married with Mrs." (contract VI) we can find others in conformity with a redundant style: "too honourable and virtuous lady Ana Masikerin" (contract I), "honourable gentleman widower Bonaventura Wergmann" (contract II), "honourable bridegroom Georg Pretner" (contract V). Above a certain understood standardization, notaries had a role to bring a spot of colour in drawing up such documents.

Regarding a certain ritual that precedes the signing of these contracts, written entries know also a variety of events transmitted to us by formulations found in the papers. It was basically a rehearsal before realization the religious marriage: "Mrs. ... offered to Mr. ... as a future fellow through the holy matrimony. They change the rings" (contract I), "lady bride gets married with her beloved groom... and she brings him all the love and Christian faith" (contract II), "she gets married to her future husband at better and worse" (contract I), "the two people promise their love and mutual faith until death" (contract V), "the two people promise their love, respect and loyalty until death" (contract IV), "the two were blessed Christianly by changing rings and have been engaged" (contract VI).

Such expressions lead us to think that the couple and family are to be indestructible and must withstand better and worse, until death, following two core values: faith and mutual love. This is understandable as the church itself considered marriage as a vow before God, which is to be respected and only one of the spouse's death may lead to religious marriage dissolution.

In terms of marital status, in all six contracts, which expected future marriages, at least one of the future spouses had been married before. Information is not uniform, thus we do not have this kind of data for all spouses. All six women were widows at the time of writing these papers, while of the six men, only one has experienced his wife's death and for the others we consider they were celibate. We could conclude that those who resort to such contracts were mainly women who have maintained and grown children and persons of a certain age who did not want to remain single or bachelors on the aim of building up a family. From this point of view not only the church but also the secular authorities were in favour of the idea of remarriage of widows and wifeless, the family being considered the normal frame of coexistence and growth of children.

Status says much about the socio-professional categories of those who resorted to such acts. Practically all six men, future heads of the family, had a job, being artisans or officials. Relationship between spouses in the marriage was full equality. In general, women entered into marriage with a dowry, and her husband came with his job and the name: "honourable groom ... is married to… Mrs. bride Elisabetha, with his name and profession of cooper" (contract V).

The woman's dowry was to be known and quantified so that in the event of separation, she could recover her initial amount. Within living together "every income or inheritance of the spouses will always be divided equally" (contract I), or, in other form, "what will the two purchase together will be equally theirs"(contract II). For this equality to be functional, possible debts and obligations of any party must be known from the very beginning. These should be clarified in the contract before marriage because the partner is not involved in the payment of such debts: "Ms bride gets married with the future husband ... but not in her debt of 60 florins" (contract I), or "lady bride has to honor some debts" (contract IV).

Such stipulations prove once again that these contracts governed the relationship between spouses into the smallest detail, leaving nothing to chance's will.

An important aspect related to the position of women in society has always been the dowry, which, although administrated by the husband, as part of conjugal property, it still remained hers. Since the beginning of the classical era to the nineteenth century, a fundamental feature of European marriage was allocation of parental property in the form of dowry to the woman who was going to marry. In this regard, the dowry should be considered part of the transmission of property from one generation to another, a process through which their daughters have access to parental property. Although the dowry was upkept by the husband as part of the conjugal fund, it continued to remain to the wife and children, as illustrated by the arrangements made when a woman remained a widow, which were correlated with the initial contribution made on her behalf. A widow recovering possession of the dowry was especially valued. She was entitled to retain all the goods, which she brought to marriage or, by agreement, the consideration thereof. She could also claim the clothes and jewels given by the husband, one third or a half of the common property after marriage and everything else that would have left her husband. In Northern Europe, she was considered the natural tutor of under-aged children, and some remained in their homes as head of the family. In the south, caring for children was taken by the family, and most widows did not receive more than the dowry (Goody, 2003, pp. 107-108).

In the marriage contracts from Arad in the XVIIIth century, the dowry problem is treated separately. Some of them refer directly to the amount by which the woman was to participate in marriage. Ana Masikerin brought into the marriage with Antony Flerer 500 florins, and Ursula Tuskanitzin brought into the marriage with Mathias Albrecht not more, nor less than 1900 florins. A special case is the widow Katharina Gulasch who had a precarious state of health at the time of signing the contract. Her wealth contained important properties: a house in Arad, agricultural land, vineyards and money. In the absence of heirs, the widow wanted to ensure by the means of this contract that part of her fortune would go to the city hospital of Arad. The contract has a number of special provisions due to special status in which the woman was and who wanted to be sure early enough of the future destination of her wealth, regardless future occurrences.

On the other hand, there were cases where the dowry of the woman did not have any pecuniary quantification. Widow Maria Elisabeth Seiterin brought into the marriage with the clerk Bonaventura Wergmann "her name and origin as a true dowry". The lack of dowry and children from a previous marriage could lead us to think that we are facing a marriage, maybe of interest, between a woman without dowry and no obligations, but in search of a social status, and a widower with children from previous marriage who needed maternal care.

In two other cases women's dowry was encumbered by the obligation to ensure a heritage for children from previous marriage. Elisabeth Luigerin is required to ensure his son Joseph 600 florins as paternal inheritance, and Ana Maria Staglin had to share the 150 florins equally to her five children from the previous marriage to Michael Stagl. In both examples above, we can say that the women's dowry had the same value as their obligations to children from previous marriage, as the legacy of the deceased spouse was divided equally between the widow and children. Other amounts not being stipulated in acts, it is likely that the two widows had an insignificant portion at the first marriage. 

Knowing that in all six contracts at least one member was in a state of widowhood, we may ask ourselves what could be the reasons for which one partner was ready to accept a marriage to a person who was committed before from another marriage. Starting from the premise that in all cases, we talk primarily about feelings or emotions that played an important role, a possible typology of these contracts might emphasize the following: 1 -desire to link the destinies based strictly on mutual and sincere feelings (contracts I and III). 2 -interest in widows, even with children, who were attractive due to their dowry (contract V). 3 -purely formal marriage in which one party has material interests and the other is to receive from the partner care, protection and the fulfillment of contractual obligations. It this case each party seeks the achievement of interests other than their own actual marriage (contract VI). 4 -disproportionate marriage regarding wealth, in which the girl without dowry accepts the protection of a man much better positioned social and material, and assumes the duties of wife and stepmother of the children of the husband from a prior marriage (contract II).

 Value and even the existence of dowry depended on social class. The poor had little to offer as dowry was usually provided by parents of the bride. However in some cases may be an additional supply provided by parents or even groom earned by own forces if the girl working and save money. There is a difference between societies under Roman law and those, which are guided by customary law. In first case stipulate "possible that there is no marriage without dowry", while customary law was more flexible: "provide dowry who wants". (Cf. Goody, 2003, pp. 111-113).

5 -marriage that leads to a so-called financial concentration in which the strength of the relationship is based more on a specific type of resource management than on other values. Any rupture in this type of marriage brings to the surface feelings that inevitably lead to separation or divorce (contract IV).

A distinct component among the clauses contained in these contracts is about the children. Structure seems to be primarily sought to ensure the future by understanding the childcare, education, maintenance and protection of their property.

Special provisions were required, because in the case of widows/widowers' remarriage, were formed complex families with stepchildren and even future stepbrothers. In this type of family lacked the priceless cement of blood contact. Starting probably from previous, notaries looked to write clauses relating to all possible cases of relations in the family as the only way of preventing future disputes or conflicts.

From this point of view, the contract between Ana Maria Staglin and Joseph Zimmer provided explicitly that paternal heritage for the five children, in amount of 150 florins, was to be divided in equal parts of 30 florins each. The three children of Ursula Tuskanitzin had a paternal inheritance as far as 300 florins each, and the son of Elisabeth Luigerin inherited a paternal part of 600 florins. All these provisions are found in terms of marriage contracts. This was a proof to the desire of children from first marriage situation preservation seen as a moral duty, which is impossible to quit. Besides the moral duty of the mother, it is found that of the stepfather's, who, at least of legal constraint, should accept such a situation with no doubts concerning the future provision of stepchildren.

Children from the first marriage will always be put on equal footing with the children to come. In the contract III it is stated clearly that "if God will bless them with heirs, their heritage will be also 30 florins" as for the children from the first marriage, or similar, in the contract I it is stipulated that "if this marriage will be blessed with heirs, so the two children of Mrs. bride and children of the couple will be equal". Also in the contract II it is said that "if they will have children together they will be equal with the other heirs", the same idea being supported in the contract IV which says that "current legacy for children and for future children will be divided equally between them".

Contracts do not contain clear information on paternal inheritance. It cannot be inferred from the context if paternal inheritance is actually a bonus, a privilege against presumptive half brothers. Certainly, stepbrothers have a status of equality in front of the couple. The father/husband should not make distinction between the wife's children from another marriage and their biological children.

He also did not discriminate between boys and girls when it came to inheritance. The new husband of the widow is often appointed the tutor of his wife's children. Basically these children were adopted and had full rights of inheritance in case of the stepfather's death, dividing property equally with their mother. The contract I has a clear provision in this direction: "If Mr. groom shall die, lady bride and the two children shall inherit all".

As guardian, the husband had to take care of maintenance and education of children up to their coming of age or marriage. In the contract IV Mathias Albrecht promises to his wife's children from the previous marriage -Johann, Joseph and Katharina -to grow and to care them Christianly. The two boys had to been offered the opportunity to learn a craft and go to proper schools for this, and the girl was to marry "as it may be better". In the contract I it is specified in the same sense that "Mr. groom, as their righteous father, will educate them in the spirit of Christianity".

Another case concerns the relationship between children from a previous marriage and the new spouses. Well-drafted clauses sought to establish a relationship without doubts between the two parties to avoid the risk of any future disputes. In the third contract it is stipulated that "the future husband will not be challenged in any aspects by the Staglin children" and in the second contract the future wife had a well-defined status in front of the possibly dead husband's children "if her husband dies, the wife has the same inheritance as the children, and will live for the rest of her life in the front rooms". So by inference we can say that the wife's status could not be demoted by stepchildren, requiring her to live in the back rooms, probably reserved for servants.

The problem regarding these terms is if there was the possibility that minors would be consulted in any way or if their opinion mattered or not in such circumstances. It is more likely that the people directly concerned have requested such provisions for greater safety in the future, and the children's consent could not be given otherwise than by assuming responsibility on behalf of the natural parent.

Why no similar clauses occur in other contracts? Unless it was not about children from previous marriage, the answer aims at least two possibilities: either it was an omission, hard to believe given that the contractors knew their interests, or mutual and full trust between the future spouses did not claim such provisions and therefore notaries did not write clauses of this type in acts.

The problem of legacies also experienced a few shades. It is not about a different interpretation of the right of inheritance, but some special clauses in contracts. At last, situations were quite clear: children inherited their parents, children and a spouse inherited the dead spouse and a spouse inherited the other spouse. There were no deviations apart from the rule, but, however, special provisions could condition the legacy from the fulfillment of some obligations assumed by any of the parties in the contract. Also there were donations on behalf of social institutions.

One such case is in the contract VI. The entire contract is different from the other for the simple reason that there are no provisions relating to children. Terms of contract's signing are more special because Katharina Gulasch's condition was more than precarious, the fragment of the contract being enlightening in this aspect -"if lady bride dies before the marriage, as it would seem her health to loom…"

It can be inferred from the contract that we are facing a marriage between a wealthy woman without heirs, but with severe health problems and a certain Michael Biro, who, more than his duty of husband, should have been a kind of testamentary legatee of his future wife's desires. From the beginning it was questionable how the time would conduct into a marriage or not, the stake being the widow's significant assets. In case the woman dies before marriage, her fortune goes to the Arad city hospital, which had the single obligation to ensure her funeral expenses. In this situation, the groom would have been entitled to receive 100 florins. In case of making marriage Michael Biro would become the heir of almost the entire fortune of Katharina Gulasch, his only obligation being to donate to the hospital the amount of 500 florins in time of 5 years, i.e. 100 florins a year.

On long term, the contract had other provisions to which the two sides subscribed. The man was forbidden to sell during his life from his legacy assets or become obliged otherwise than with the authorities' consent. By this provision, the city Magistrate, as a state institution, became the main factor in assets' monitoring, which "must remain unshared", and by default in the execution of the contract. Maintaining the integrity of assets must be kept in case Michael Biro would have died "without woman and children", then, in its whole, was to turn up to the hospital in Arad which was to bear in this case "all the funeral costs and other costs".

However, Katharina Gulasch's assets dissolution could be realized in legal terms only in a single way. The modality through which it would not end as a gift to the hospital was that Michael Biro would re-marry, therefore the entire heritage would "remain to his widow or children", if he passed away.

The particularly aspect of this contract lies not only in the legacy issues provided but also in the involvement of a state institution in monitoring and tracking the application of clauses. To this is added the fact that the document was signed by both sides and reinforced by the signatures of two witnesses, a lawyer, a local judge and, obviously, a notary. The complexion of the situation is given also by the fact that this contract was probably sealed under the time pressure because of the woman's health state. The most interesting aspect worth mentioning is that all these were realized away from her residence in Arad, namely in Nakofalva,  Torontal County. How did the woman get there, which were the causes of her disease, why did she not bequeath the property simply to the hospital are unanswered questions because the document does not refer to them. In absence of such information, we may think that it was a marital engagement to a widow with no heirs who sought to marry again. On the same realm of allegations, we could presume that things had precipitated due to the health status of the woman who had a disease in an advanced stage on the marriage's eve. Health problems were certainly older, so that we could explain her obstinacy to provide donations for the Arad hospital, to which she probably felt the need to be grateful.

In addition to various information, marriage contracts inform us indirectly about the literacy of those involved to the extent that we find their signatures on documents. Practically every contract should have had the signatures of the spouses, of the godfathers or witnesses, of the notary or lawyer.

To what extent were to write the inhabitants of Arad in the XVIIIth century is difficult to determine from just a few contracts of marriage. This could be done much better if they had inventoried the number of signatures on marriage contracts in Arad in XVIIIth century. Even then, the conclusions would not necessarily be very true, knowing that those resorting to such acts had a social status above average and it is assumed that their literacy was higher.

The backside of marriage has always been the divorce. The Church has always condemned the violation of the holy marriage. The mutations produced in Europe in the XVIIIth century after the process of secularization brought a new optic towards the possibility of disposing of marriage. This secularization meant implicitly waiving the supervision of the church and taking it into the state's possession, a phenomenon that occurred at the end of the XVIIIth century (Goody, 2003, p. 103). This is also noticeable in the city of Arad at the end of the XVIIIth century. To emphasize some aspects related to the divorce problem, but especially to highlight the nuances of daily life we have chosen two documents regarding the sharing of goods in case of separation or dissolution of marriage. Both acts, on sharing of the wealth, derive from the end of the XVIIIth century. At the basis of  Nakofalva or Nakodorf is today Nakovo town in northeastern Serbia.

election stated the criterion of information wealth and a special appearance for each.

In the first case we are dealing with a divorce between an orthodox by name -Martha Onn -probably Romanian and his wife Ana (Anna) about we have no direct information on ethnicity, while the second case concerns the subjects of a marriage contract presented above, naming them here as Mathias Albrecht and Ursula Tuskanitzin (contract IV). The provisions of both documents emphasize two families who had households and relatively high income and for this purpose, the local institutions were involved in providing a framework of shared wealth. To this probably contributed the status of those who were to divorce.

In the case of Martha Onn, the Orthodox bishop himself made a request to the City Magistrate to investigate the conditions of divorce. To this was charged Georg Jankovitsch, who had to lay down a sort of report on property and divorce causes. Turning to ethnicity or better said the woman's confession, the document speaks of "Thoro et Mensa" separation of the two (See: Stuart, 1994, p. 39). This means that Ana was of Catholic religion, being known that this kind of separation was practiced by Romano-Catholic church. Separation "of bed and table" entitles the spouses to live separately, but the marriage was considered legal further and the partners are not allowed to marry again.

Such a request from the Orthodox bishop could not be made unless the person regarded had a certain social status or anywhere it wanted to come to the aid of a parishioner of his who has suffered an injustice. A possible condition of the male figure can be inferred from another document where Martha Onn was responsible for one of the 84 streets of the city of Arad. More specifically, he was responsible for one of the 15 streets of the "Romanian neighbourhood" named in the document Wallachaei (DJAN Arad, fond PmA, dosar 3/1783, fila 7). In that year, he was newly married.

The councillor Georg Jankovitsch has compiled the inventory of goods to be shared only after a trip to the scene, after the findings made by him and in accordance with the "words and avowals of the two". The list includes things of the most diverse: land properties, livestock, tools, harness, wood, seeds, grains, fruits and other foods, etc. Their household's size was quite significant: 10 iugăre of land and 5 iugăre  of pasture, 5 oxen, 3 cows, 1 heifer, 1 calf, a cart, important quantities of fruit, flour, corn, hay, various tools (shingles, flour measure, shovel, braided baskets, one saddle with all accessories, forks, scythe), wood etc. All of these were owned by the man, the woman taking just the bedding, 5 wire links for  iugăr (lat. jugerum, germ. Joch) -unit of area equivalent to 0.57 of a hectare sacks and 3 bags. During the period of separation, before the divorce is over and before the sharing of goods, the man sold some animals, hay, straw, corn and fruit valued at 226 florins and 46 farthings. Part of the amount -26 florins -was given to the wife in the previous year but the remaining assets of more than 200 florins, were to be divided or quantified in the sharing of wealth. The document expressly mentions the "significant loss of livestock in inventory", practically 166 of the 226 florins being obtained from the sale of 4 oxen and 3 cows.

I do not know to what extent secular authorities were involved in stopping the phenomenon of family dissolution through divorce, but the context of the document shows clearly that the one in charge with the investigation of their situation makes consignments and even recommendations based on what he found. His sentence is clear when he says that "as regards the life of the two, it cannot expect an improvement", living under the same roof being unrealistic in his view. Moreover, he considers that "to prevent any danger it is better that the two separate for ever". To strengthen his statements, he claims that the neighbours confirmed what he said. The conclusion was that the two spouses had different tempers and "could not get along particularly from the husband's guilt". The document does not refer to any concrete blame as conjugal violence or adultery, but notes that after 16 years of marriage the two must separate.

The second case is more complex because of the assets held by the two. The marriage of Mathias Albrecht with Ursula Tuskanitzin had place a few years ago, more precisely in 1791 (contract IV). What happened in this family so that living together in 1799 could not be possible anymore we could not learn in a concrete way. However, a possible cause could be related to some debts of the widow which initially were overlooked in the contract and that is why later was added an additional item. Failure to comply with their own promises was a major cause of divorce also in other parts of Europe (Goody, 2003, p. 93).

The inventory of assets of the two highlights a family with above average resources, with properties and substantial income. This is observed inclusive in the marriage contract where the future bride's dowry was 1900 florins, more than any other dowry listed in the above contracts. Her former husband -Mathias Albrecht -was a carpenter, who certainly enjoyed foraging, judging by the revenue he had to receive from various persons or even official institutions of Arad and Pecica. The amounts of money collected could have been loans, but taking into account the profession practiced by Mathias Albrecht and that organs were among the borrowers we excluded this fact.

Probably after some performed works, he had to receive payments from 30 debtors. The values of these sums were very varied, ranging from 2-3 florins for some people to 279 florins that he had to receive from the pay office of Arad or 159 florins from Pecica authorities. Other sums were to be received from various people such as Mr. Nemiro -100 florins, Mr. Warsteiner -78 florins, Mr. Henter -50 florins etc. In total, these revenues amounted to 1169 florins and 7 farthings and were to be part of the category of amounts that were to be divided. Their properties prove, once again, that we are facing a wealthy couple. They owned two houses -one of 3000 florins and other valued at 2600 florins -a vineyard of 1000 florins in Minis, a dwelling with house and garden of 200 florins, a small house in the old fortress of 80 florins etc. the total value amounting to 7373 of florins, also to be divided.

Other sums, entered in question, came from the sale of goods or properties that Ursula Tuskanitzin inherited after the death of her former husband and brought in her new family. These accounted for a total of 3240 florins and 14 farthings. At one simple addition the amount of wealth, which was to be divided, raised to 11.782 florins and 21 farthings. From this sum was subtracted 1900 florins, which was brought by the woman as dowry, remaining 9882 florins and 21 farthings as net value, i.e. 4941 florins and 10,5 farthings apiece.

This document, dated as of January 1799, is drafted in the purpose to evaluate as accurately as possible the assets to be divided.

In addition to legal information, both inventories which led to the compilation of documents on which was to be divided the wealth reveal a different perspective on the history and daily life in Arad at the end of the XVIIIth century. Beyond the matrimonial problems, the documents give us the complete picture of what meant a certain type of household and its structure back then. In the first case, we are facing an average household with obvious agricultural purposes judging by the number of animals, tools, implements and products at home and in the second, we deal with an important artisan's family, a richer family, given the number and value of properties and income.

The price of immovable and various products in the epoch are not to be neglected. Hereby, we learn that 2 large bullocks worth together 77 florins, a cow -19-22 florins, a measure  of corn -1 florin and 32 farthings, a measure of fruit -2 florins and 32 farthings, a house of a well off family -3000 florins, a vineyard in Minis with the afferent outbuildings -1000 florins etc.

 Measure used in this period is called câbla or cubul (lat. cubuls, germ. Kübel, magh. köböl). In Arad county this measure had a volume of 124.9 litres (Cf. Ciuhandu, 1940, p. 111).

  : Contract I -between Flerer Antony and Ana Masikerin dated July 21, 1762 (DJAN Arad, fond PmA, dosar 18/1762, filele 1-2). Contract II -between Wergmann Bonaventura and Maria Elisabeth Seiterin dated August 31, 1762 (DJAN Arad, fond PmA, dosar 18/1762, filele 3-4). Contract III -between Joseph Zimmer and Ana Maria Staglin dated May 31, 1763 (DJAN Arad, fond PmA, dosar 14/1763). Contract IV -between Mathias Albrecht and Ursula Tuskanitzin dated May 1, 1791  (DJAN Arad, fond PmA, dosar 7/1792, filele 1-2).Contract V -between Pretner Georg and Elisabetha Luigerin dated November 14, 1793 (DJAN Arad, fond PmA, dosar 7/1792, filele 3-4).

Contract VI -between Michael Biro and Katharina Gulasch dated February 15, 1795 (DJAN Arad, fond PmA, dosar 7/1792, filele 5-6).

Divorce I -Martha Onn and Ana, dated May 15, 1798 (DJAN Arad, fond PmA, dosar 7/1792, filele 8-10).

Conclusions

This study proposed, first, to carry out, based on archive documents, an incursion as regards matrimonial relationships with all legal, economic and social connotations involved. The marriage contracts studied fall into a typology more closely of what was happening in the same period in Western Europe than in South Eastern Europe. This is because, as I noted, such acts have emerged within the former county of Arad in the XVIIIth century after the establishment of Habsburg domination and after the German colonists were brought into the area.

The Europe of the eighteenth century was not homogeneous as regards the familial systems, despite the common denominator -the Christian religion. No doubt, that the old differences based on ethnicity, social class and geographic areas affected practices in the "Century of Lights" (Goody, 2003, p. 123). Certainly, in Arad County the family characteristics among Orthodox were different from those of Catholic families. Unfortunately, the archives keep too little categories of documents on which we could reconstruct aspects of family life among the population of Orthodox religion, so by default for the Romanian population. Less information we have about families in rural areas, where, in the XVIIIth century, Romanian ethnics were the majority. Maybe just the retrospective method of ethnography and historical anthropology studies can make additions to that effect, and future research will pursue this issue.