github.com/consensys/gnark@v0.11.0/backend/witness/vector.go (about) 1 package witness 2 3 import ( 4 "errors" 5 "math/big" 6 "reflect" 7 8 "github.com/consensys/gnark-crypto/ecc" 9 fr_bls12377 "github.com/consensys/gnark-crypto/ecc/bls12-377/fr" 10 fr_bls12381 "github.com/consensys/gnark-crypto/ecc/bls12-381/fr" 11 fr_bls24315 "github.com/consensys/gnark-crypto/ecc/bls24-315/fr" 12 fr_bls24317 "github.com/consensys/gnark-crypto/ecc/bls24-317/fr" 13 fr_bn254 "github.com/consensys/gnark-crypto/ecc/bn254/fr" 14 fr_bw6633 "github.com/consensys/gnark-crypto/ecc/bw6-633/fr" 15 fr_bw6761 "github.com/consensys/gnark-crypto/ecc/bw6-761/fr" 16 "github.com/consensys/gnark/internal/tinyfield" 17 "github.com/consensys/gnark/internal/utils" 18 ) 19 20 func newVector(field *big.Int, size int) (any, error) { 21 curveID := utils.FieldToCurve(field) 22 switch curveID { 23 case ecc.BN254: 24 return make(fr_bn254.Vector, size), nil 25 case ecc.BLS12_377: 26 return make(fr_bls12377.Vector, size), nil 27 case ecc.BLS12_381: 28 return make(fr_bls12381.Vector, size), nil 29 case ecc.BW6_761: 30 return make(fr_bw6761.Vector, size), nil 31 case ecc.BLS24_317: 32 return make(fr_bls24317.Vector, size), nil 33 case ecc.BLS24_315: 34 return make(fr_bls24315.Vector, size), nil 35 case ecc.BW6_633: 36 return make(fr_bw6633.Vector, size), nil 37 default: 38 if field.Cmp(tinyfield.Modulus()) == 0 { 39 return make(tinyfield.Vector, size), nil 40 } else { 41 return nil, errors.New("unsupported modulus") 42 } 43 } 44 } 45 46 func newFrom(from any, n int) (any, error) { 47 switch wt := from.(type) { 48 case fr_bn254.Vector: 49 a := make(fr_bn254.Vector, n) 50 copy(a, wt) 51 return a, nil 52 case fr_bls12377.Vector: 53 a := make(fr_bls12377.Vector, n) 54 copy(a, wt) 55 return a, nil 56 case fr_bls12381.Vector: 57 a := make(fr_bls12381.Vector, n) 58 copy(a, wt) 59 return a, nil 60 case fr_bw6761.Vector: 61 a := make(fr_bw6761.Vector, n) 62 copy(a, wt) 63 return a, nil 64 case fr_bls24317.Vector: 65 a := make(fr_bls24317.Vector, n) 66 copy(a, wt) 67 return a, nil 68 case fr_bls24315.Vector: 69 a := make(fr_bls24315.Vector, n) 70 copy(a, wt) 71 return a, nil 72 case fr_bw6633.Vector: 73 a := make(fr_bw6633.Vector, n) 74 copy(a, wt) 75 return a, nil 76 case tinyfield.Vector: 77 a := make(tinyfield.Vector, n) 78 copy(a, wt) 79 return a, nil 80 default: 81 return nil, errors.New("unsupported modulus") 82 } 83 } 84 85 func leafType(v any) reflect.Type { 86 switch v.(type) { 87 case fr_bn254.Vector: 88 return reflect.TypeOf(fr_bn254.Element{}) 89 case fr_bls12377.Vector: 90 return reflect.TypeOf(fr_bls12377.Element{}) 91 case fr_bls12381.Vector: 92 return reflect.TypeOf(fr_bls12381.Element{}) 93 case fr_bw6761.Vector: 94 return reflect.TypeOf(fr_bw6761.Element{}) 95 case fr_bls24317.Vector: 96 return reflect.TypeOf(fr_bls24317.Element{}) 97 case fr_bls24315.Vector: 98 return reflect.TypeOf(fr_bls24315.Element{}) 99 case fr_bw6633.Vector: 100 return reflect.TypeOf(fr_bw6633.Element{}) 101 case tinyfield.Vector: 102 return reflect.TypeOf(tinyfield.Element{}) 103 default: 104 panic("invalid input") 105 } 106 } 107 108 func set(v any, index int, value any) error { 109 switch pv := v.(type) { 110 case fr_bn254.Vector: 111 if index >= len(pv) { 112 return errors.New("out of bounds") 113 } 114 _, err := pv[index].SetInterface(value) 115 return err 116 case fr_bls12377.Vector: 117 if index >= len(pv) { 118 return errors.New("out of bounds") 119 } 120 _, err := pv[index].SetInterface(value) 121 return err 122 case fr_bls12381.Vector: 123 if index >= len(pv) { 124 return errors.New("out of bounds") 125 } 126 _, err := pv[index].SetInterface(value) 127 return err 128 case fr_bw6761.Vector: 129 if index >= len(pv) { 130 return errors.New("out of bounds") 131 } 132 _, err := pv[index].SetInterface(value) 133 return err 134 case fr_bls24317.Vector: 135 if index >= len(pv) { 136 return errors.New("out of bounds") 137 } 138 _, err := pv[index].SetInterface(value) 139 return err 140 case fr_bls24315.Vector: 141 if index >= len(pv) { 142 return errors.New("out of bounds") 143 } 144 _, err := pv[index].SetInterface(value) 145 return err 146 case fr_bw6633.Vector: 147 if index >= len(pv) { 148 return errors.New("out of bounds") 149 } 150 _, err := pv[index].SetInterface(value) 151 return err 152 case tinyfield.Vector: 153 if index >= len(pv) { 154 return errors.New("out of bounds") 155 } 156 _, err := pv[index].SetInterface(value) 157 return err 158 default: 159 panic("invalid input") 160 } 161 } 162 163 func iterate(v any) chan any { 164 chValues := make(chan any) 165 switch pv := v.(type) { 166 case fr_bn254.Vector: 167 go func() { 168 for i := 0; i < len(pv); i++ { 169 chValues <- &(pv)[i] 170 } 171 close(chValues) 172 }() 173 case fr_bls12377.Vector: 174 go func() { 175 for i := 0; i < len(pv); i++ { 176 chValues <- &(pv)[i] 177 } 178 close(chValues) 179 }() 180 case fr_bls12381.Vector: 181 go func() { 182 for i := 0; i < len(pv); i++ { 183 chValues <- &(pv)[i] 184 } 185 close(chValues) 186 }() 187 case fr_bw6761.Vector: 188 go func() { 189 for i := 0; i < len(pv); i++ { 190 chValues <- &(pv)[i] 191 } 192 close(chValues) 193 }() 194 case fr_bls24317.Vector: 195 go func() { 196 for i := 0; i < len(pv); i++ { 197 chValues <- &(pv)[i] 198 } 199 close(chValues) 200 }() 201 case fr_bls24315.Vector: 202 go func() { 203 for i := 0; i < len(pv); i++ { 204 chValues <- &(pv)[i] 205 } 206 close(chValues) 207 }() 208 case fr_bw6633.Vector: 209 go func() { 210 for i := 0; i < len(pv); i++ { 211 chValues <- &(pv)[i] 212 } 213 close(chValues) 214 }() 215 case tinyfield.Vector: 216 go func() { 217 for i := 0; i < len(pv); i++ { 218 chValues <- &(pv)[i] 219 } 220 close(chValues) 221 }() 222 default: 223 panic("invalid input") 224 } 225 return chValues 226 } 227 228 func resize(v any, n int) any { 229 switch v.(type) { 230 case fr_bn254.Vector: 231 return make(fr_bn254.Vector, n) 232 case fr_bls12377.Vector: 233 return make(fr_bls12377.Vector, n) 234 case fr_bls12381.Vector: 235 return make(fr_bls12381.Vector, n) 236 case fr_bw6761.Vector: 237 return make(fr_bw6761.Vector, n) 238 case fr_bls24317.Vector: 239 return make(fr_bls24317.Vector, n) 240 case fr_bls24315.Vector: 241 return make(fr_bls24315.Vector, n) 242 case fr_bw6633.Vector: 243 return make(fr_bw6633.Vector, n) 244 case tinyfield.Vector: 245 return make(tinyfield.Vector, n) 246 default: 247 panic("invalid input") 248 } 249 }