Skip to content

Commit 6e9eebe

Browse files
committed
inverse_mat_norm_bound for block jacobi
1 parent a75edf6 commit 6e9eebe

2 files changed

Lines changed: 118 additions & 14 deletions

File tree

fma_floating_point_model.v

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ Set Bullet Behavior "Strict Subproofs".
1010

1111
Require Import floatlib.
1212

13-
1413
Section WITHNANS.
1514
Context {NANS: Nans}.
1615

@@ -143,7 +142,6 @@ Notation "-f A" := (opp_mat A) (at level 50).
143142
Notation "A *f B" := (mulmx_float A B) (at level 70).
144143
Notation "A -f B" := (sub_mat A B) (at level 80).
145144

146-
147145
Definition A1_inv_J {ty} {n:nat} (A: 'M[ftype ty]_n.+1) : 'cV[ftype ty]_n.+1 :=
148146
\col_i (BDIV (Zconst ty 1) (A i i)).
149147

@@ -168,21 +166,19 @@ Definition X_m_jacobi {ty} {n:nat} m x0 b (A: 'M[ftype ty]_n.+1) :
168166
'cV[ftype ty]_n.+1 :=
169167
Nat.iter m (fun x0 => jacobi_iter x0 b A) x0.
170168

169+
(*unit vector with ith-element = 1*)
170+
Definition e_i {n : nat} {ty} (i : 'I_n.+1) : 'cV[ftype ty]_n.+1 :=
171+
\col_(j < n.+1) (if j == i then (Zconst ty 1) else (Zconst ty 0)).
171172

172-
Definition matrix_inj' {t} (A: matrix t) m n d d': 'M[ftype t]_(m,n):=
173-
\matrix_(i < m, j < n)
174-
nth j (nth i A d) d'.
175-
176-
Definition matrix_inj {t} (A: matrix t) m n : 'M[ftype t]_(m,n):=
177-
matrix_inj' A m n [::] (Zconst t 0).
178-
179-
Definition vector_inj' {t} (v: vector t) n d : 'cV[ftype t]_n :=
180-
\col_(i < n) nth i v d.
181-
182-
Definition vector_inj {t} (v: vector t) n : 'cV[ftype t]_n :=
183-
vector_inj' v n (Zconst t 0).
184173

174+
(* Approximate solving for a column of A^-1 using m Jacobi iterations *)
175+
Definition ith_col_A_inv {ty} {n : nat} m x0 (A : 'M[ftype ty]_n.+1) (i : 'I_n.+1): 'cV[ftype ty]_n.+1 :=
176+
let b := e_i i in
177+
X_m_jacobi m x0 b A.
185178

179+
(* Define the approximate inverse of A after m Jacobi iterations *)
180+
Definition A_inv_jacobi {ty} {n : nat} m (x0 : 'cV[ftype ty]_n.+1) (A : 'M[ftype ty]_n.+1) : 'M[ftype ty]_n.+1 :=
181+
(\matrix_(i < n.+1) (ith_col_A_inv m x0 A i)^T)^T.
186182

187183
Lemma length_veclist {ty} {n m:nat} (v: 'cV[ftype ty]_n.+1):
188184
length (@vec_to_list_float _ n m v) = m.

fma_jacobi_forward_error.v

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ Notation "A -f B" := (sub_mat A B) (at level 80).
4040

4141

4242

43+
4344
Definition f_error {ty} {n:nat} m b x0 x (A: 'M[ftype ty]_n.+1):=
4445
let x_k := X_m_jacobi m x0 b A in
4546
let A_real := FT2R_mat A in
@@ -424,6 +425,69 @@ rewrite -bigmaxr_mulr.
424425
by rewrite size_map size_enum_ord in H1.
425426
+ apply /RleP. apply default_rel_ge_0.
426427
Qed.
428+
Search (lift ord0 _).
429+
(*** Lemma for error bound on the inverse obtained by jacobi***)
430+
Lemma jacobi_inverse_mat_norm_bound {ty} {n:nat} k (x0 : 'cV[ftype ty]_n.+1) (A: 'M[ftype ty]_n.+1):
431+
(forall i, finite (BDIV (Zconst ty 1) (A i i ))) ->
432+
(forall i, finite (A i i)) ->
433+
let A_real := FT2R_mat A in
434+
(matrix_inf_norm (FT2R_mat (A_inv_jacobi k x0 A) - A_real^-1) <=
435+
\sum_(j < n.+1) f_error k (e_i j) x0 (col j A_real^-1) A)%Re.
436+
Proof.
437+
intros.
438+
(* assert (Hneq: forall i, (FT2R (A i i) <> 0%Re)).
439+
{ intros. by apply BDIV_FT2R_sep_zero. } *)
440+
unfold matrix_inf_norm, row_sum.
441+
apply bigmax_le.
442+
+rewrite size_map.
443+
rewrite size_enum_ord.
444+
auto.
445+
+intros.
446+
rewrite seq_equiv.
447+
rewrite nth_mkseq.
448+
++assert (H2: forall j,
449+
(Rabs ((FT2R_mat (A_inv_jacobi k x0 A) - A_real^-1)%Ri(inord i) j)
450+
<= f_error k (e_i j) x0 (col j A_real^-1) A)%Re).
451+
{ intros.
452+
unfold f_error.
453+
unfold vec_inf_norm.
454+
assert (H3: exists i0, (FT2R_mat (A_inv_jacobi k x0 A) - A_real^-1)%Ri(inord i) j =
455+
seq.nth ).
456+
eapply bigmaxr_ler.
457+
458+
Search (bigmaxr).
459+
460+
(* rewrite seq_equiv. *)
461+
unfold A_inv_jacobi,ith_col_A_inv.
462+
unfold x_fix. unfold diag_matrix_vec_mult_R.
463+
admit.
464+
(* rewrite bigmaxr_ler.
465+
-rewrite size_map size_enum_ord. auto.
466+
-intros. rewrite seq_equiv. rewrite nth_mkseq.
467+
rewrite !mxE. apply Rle_refl. *)
468+
}
469+
induction n as [|n' IHn'].
470+
+++ rewrite big_ord_recl.
471+
rewrite big_ord_recl.
472+
rewrite big_ord0.
473+
rewrite big_ord0.
474+
rewrite addr0.
475+
rewrite addr0.
476+
apply H2.
477+
+++ rewrite big_ord_recl.
478+
setoid_rewrite big_ord_recl at 2.
479+
apply Rplus_le_compat.
480+
- apply H2.
481+
- admit.
482+
(* eapply IHn'.
483+
rewrite lift0 n i0.
484+
remember (FT2R_mat (A_inv_jacobi k x0 A) - A_real^-1) as delta_mat.
485+
remember (\sum_(i0 < n'.+1) Rabs (delta_mat (inord i) (lift ord0 i0))) as lhs.
486+
remember (\sum_(i0 < n'.+1) f_error k (e_i (lift ord0 i0)) x0 (col (lift ord0 i0) A_real^-1) A) as rhs.
487+
assert (lhs <= rhs)%Re.
488+
{ apply IHn'. intros. apply H2. } *)
489+
++rewrite size_map size_enum_ord in H1. assumption.
490+
Admitted.
427491

428492
Lemma list_split_l {T} (l : list (T * T)) (a:T * T):
429493
(List.split (a :: l)).1 = (a.1 :: (List.split l).1).
@@ -435,6 +499,7 @@ induction l; simpl; intros; auto.
435499
destruct a; simpl; auto.
436500
Qed.
437501

502+
438503
Lemma list_split_r {T} (l : list (T * T)) (a:T * T):
439504
(List.split (a :: l)).2 = (a.2 :: (List.split l).2).
440505
Proof.
@@ -1059,6 +1124,49 @@ specialize (H6 H5). apply H6.
10591124
by rewrite !length_veclist.
10601125
Qed.
10611126

1127+
(** State the forward error theorem **)
1128+
Theorem block_jacobi_forward_error_bound_aux {ty} {n:nat} (delta_D:R)
1129+
(A: 'M[ftype ty]_n.+1) (b: 'cV[ftype ty]_n.+1):
1130+
let A_real := FT2R_mat A in
1131+
let b_real := FT2R_mat b in
1132+
let x:= A_real^-1 *m b_real in
1133+
let R := (vec_inf_norm (A1_diag A_real) * matrix_inf_norm (A2_J_real A_real))%Re in
1134+
let delta := default_rel ty in
1135+
let rho := ((((1 + g ty n.+1) * (1 + delta) *
1136+
g ty n.+1 + delta * (1 + g ty n.+1) +
1137+
g ty n.+1) * (1 + delta) + delta) * R +
1138+
(((1 + g ty n.+1) * (1 + delta) *
1139+
g ty n.+1 + delta * (1 + g ty n.+1) +
1140+
g ty n.+1) * default_abs ty +
1141+
default_abs ty) *
1142+
matrix_inf_norm (A2_J_real A_real) + R)%Re in
1143+
let d_mag := ((g ty n.+1 * (1 + delta) + delta) *
1144+
((vec_inf_norm (A1_diag A_real) *
1145+
(1 + delta) + default_abs ty) *
1146+
vec_inf_norm b_real) +
1147+
(1 + g ty n.+1) * g1 ty n.+1 (n.+1 - 1) *
1148+
(1 + delta) *
1149+
(vec_inf_norm (A1_diag A_real) *
1150+
(1 + delta) + default_abs ty) +
1151+
g1 ty n.+1 (n.+1 - 1) +
1152+
(vec_inf_norm (A1_diag A_real) * delta +
1153+
default_abs ty) * vec_inf_norm b_real +
1154+
((((1 + g ty n.+1) * (1 + delta) *
1155+
g ty n.+1 + delta * (1 + g ty n.+1) +
1156+
g ty n.+1) * (1 + delta) + delta) * R +
1157+
(((1 + g ty n.+1) * (1 + delta) *
1158+
g ty n.+1 + delta * (1 + g ty n.+1) +
1159+
g ty n.+1) * default_abs ty +
1160+
default_abs ty) *
1161+
matrix_inf_norm (A2_J_real A_real)) *
1162+
vec_inf_norm (x_fix x b_real A_real))%Re in
1163+
forall x0: 'cV[ftype ty]_n.+1,
1164+
forward_error_cond A x0 b ->
1165+
(forall k:nat,
1166+
(forall i, finite (X_m_jacobi k x0 b A i ord0)) /\
1167+
(f_error k b x0 x A <= rho^k * (f_error 0 b x0 x A) + ((1 - rho^k) / (1 - rho))* d_mag)%Re).
1168+
1169+
10621170
(** State the forward error theorem **)
10631171
Theorem jacobi_forward_error_bound_aux {ty} {n:nat}
10641172
(A: 'M[ftype ty]_n.+1) (b: 'cV[ftype ty]_n.+1):

0 commit comments

Comments
 (0)